zoukankan      html  css  js  c++  java
  • hive 源码笔记(1):命令行执行的主流程。

    1. ‘hive’命令是(默认为hive跟目录)./bin下的一个shell脚本,依次加载
    1. ./bin/hive-config.sh,
    2. ./conf/hive-env.sh, 
    3. 设置与hadoop、spark、hbase等相关的环境变量、辅助jar文件加载,
    4. 依赖的资源的合法性检查, 然后加载
    5. 载入./lib/ext目录下的所有被称为“service”的脚本里面定义的shell函数,函数里面就是通过“hadoop jar CLASS arg* ”启动了
    6. 根据命令行参数 “--service x”指定的值选择一个service,调用这个service的shell函数以启动hive。不带这个选项时默认是“cli”。
    7. 调用hadoop执行对应的service class。
    2. cli 这个service的启动。
        对应的启动类为CliDriver的run函数。
    public class CliDriver 
    CliDriver.run
      ->OptionsProcessor.process_stage1(args) --初始化hive的配置文件
      ->CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class)); --每个命令行中断都是一个session
      ->oproc.process_stage2(ss)--初始化命令行选项对应的属性设置
      ->SessionState.start(ss);
      ->return executeDriver(ss, conf, oproc);
    ->int cmdProcessStatus = cli.processLine(ss.execString); --"-e"选项执行,最终调用processLine(String line, boolean allowInterrupting)
    ->return cli.processFile(ss.fileName); -- "-f"选项执行,最终调用 processLine(String line, boolean allowInterrupting)
    ->reader.addCompleter(completer); --对于交互式的命令行,设置判定一个语句结束的“判定者”。
    ->ret = cli.processLine(line, true); -- 遇到一个完整的语句则执行一条语句
    processLine(String line, boolean allowInterrupting)
      ->oldSignal = Signal.handle(interruptSignal, new SignalHandler() --处理“ctl+c”
      ->ret = processCmd(command);
    ->String[] tokens = tokenizeCmd(cmd_trimmed); --命令行token化
    ->if (cmd_trimmed.toLowerCase().equals("quit") || cmd_trimmed.toLowerCase().equals("exit")) --退出
    ->if (tokens[0].equalsIgnoreCase("source")) --加载文件
     ->cmd_1 = new VariableSubstitution().substitute(ss.getConf(), cmd_1); --替换文件名中的变量,如set,env等
     -> ret = processFile(cmd_1); --又回到执行文件了
    ->if (cmd_trimmed.startsWith("!")) --执行shell命令
    ->else CommandProcessor proc = CommandProcessorFactory.get(tokens, (HiveConf) conf);
    ret = processLocalCmd(cmd, proc, ss);
     ->qp.run(cmd).getResponseCode(); --Driver.run()执行命令行,然后显示结果
     
     
    public class Driver implements CommandProcessor
      public CommandProcessorResponse run(String command, boolean alreadyCompiled)
    -> CommandProcessorResponse cpr = runInternal(command, alreadyCompiled);
     ->HiveDriverRunHookContext hookContext = new HiveDriverRunHookContextImpl(conf, command); --hook相关初始化调用
     ->private int compileInternal(String command)
    -> public int compile(String command, boolean resetTaskIds)
     ->ParseDriver pd = new ParseDriver(); --语法分析,生成抽象语法书AST
     ->ASTNode tree = pd.parse(command, ctx);
     ->BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(conf, tree); --语义分析,生成逻辑计划
     ->sem.analyze(tree, ctx);  
     ->plan = new QueryPlan(command, sem, perfLogger.getStartTime(PerfLogger.DRIVER_RUN), queryId,
    SessionState.get().getCommandType());  --生成查询计划
    ->if (requiresLock()) ret = acquireLocksAndOpenTxn(); --如果需要一致性,获取锁。默认不需要一致性。
    ->ret = execute(); --执行计划
    ->return createProcessorResponse(ret);

      
    3. 至于语法分析、语意分析、执行计划,需要后续单独分析。
      




  • 相关阅读:
    开课博客
    高级UI组件(二)
    《梦断代码》读后感(三)
    高级UI组件
    今日总结
    今日总结
    android中关于时间的控件
    单选按钮和复选框
    Android开发中按钮的语法
    布局管理器的嵌套
  • 原文地址:https://www.cnblogs.com/zwCHAN/p/4369744.html
Copyright © 2011-2022 走看看