Hive CLI执行流程分析

说明:  本文基于apache hive1.1.0

1.启动脚本:

 $HIVE_HOME/bin/hive --> $HIVE_HOME/bin/ ext/cli.sh  可以看到入口类org.apache.hadoop.hive.cli.CliDriver

2.入口类: 

 apache-hive-1.1.0-src/cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java


(1)  参数解析OptionsProcessor( -f -hiveconf -d -i 等等参数解析) 

       process_stage1  如果是hiveconf的参数就System.setProperty , 并把-d 和 -hivevar的加入到hiveVariables中

(2) log4j 日志加载 initHiveLog4j( 此时会调用HiveConf 并将里面的一些静态变量初始化了,获取日志的一些配置)

(3) 创建CliSessionState 

       创建HiveConf,设置hiveJar = hive-exec-1..1.0.jar

(4)  参数解析 process_stage2 并将参数设置到CliSessionState中(-S -database -e -f -v -i 等)

(5) SessionState.start (CliSessionState设置到SessionState中)

           通过Hive(apache-hive-1.1.0-src/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java) 创建HiveDb

           通过Hive getMSC 获取MetaStoreClient

(6) executeDriver  执行

            创建 cliDriver

            如果-e 执行processLine(ss.execString)

            如果-f  执行processFile(ss.fileName)

            创建ConsoleReader  while 循环读取用户输入,遇到“;”为一个完整的命令,执行该命令(cli.ProcessLine 处理)

            

 3. ProcessLine 每条语句处理流程

  (1) 设置中断信号处理 --> processCmd

        如果是quit, exit 退出

        如果是source 加载文件 processFile 处理

        如果是!处理shell

        processLocalCmd 处理正常语句(通过不同的CommandProcessor 处理不同的语句)

                通过hiveCommand 执行不同的Processor

                set           SetProcessor,设置修改参数,设置到SessionState的HiveConf里。 
                dfs           DfsProcessor,使用hadoop的 FsShell运行hadoop的命令。 
                add         AddResourceProcessor  添加到SessionState的resource_map里,运行提交job的时候会写入 Hadoop的Distributed Cache。 
                delete    DeleteResourceProcessor从SessionState的resource_map里删除。

                  list         ListResourceProcessor  列出资源

                 如果为hiveCommand 为null 执行Driver中的run 函数

(2)  Driver run 执行 runInternal

      获取hive.exec.driver.run.hooks 执行自己定义的一些hook函数,hive 默认为空

     compileInternal 进行编译

     execute 执行

(3) compileInternal 编译

       词法分析(通过HiveParse。 进行解析)  此时会获取语句的TOK 类型(例如TOK_SHOWDATABASES, TOK_SHOWTABLES, TOK_QUERY)


      语义分析BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(conf, tree);

            通过不同的tree.getType 来创建不同的语义分析

                TOK_EXPLAIN --->  ExplainSemanticAnalyzer

                TOK_EXPLAIN_SQ_REWRITE --> ExplainSQRewriteSemanticAnalyzer

                TOK_LOAD     ---> LoadSemanticAnalyzer

                TOK_EXPORT -->ExportSemanticAnalyzer

                TOK_IMPORT -->ImportSemanticAnalyzer

                DDLSemanticAnalyzer 操作(ALTER, SHOW GRANT 等等操作)

                TOK_QUERY 用的SeManticAnalyzer(select , insert)

     hive.semantic.analyzer.hook ,在执行sem.analyze 前后执行preAnalyze 和 postAnalyze

     plan = new QueryPlan()

     plan.getFetchTask().initialize(conf,plan,null)  初始化FetchTask

     schema = getSchema()  获取返回的schema

     sem.skipAuthorization() 授权操作 doAuthorization

     

4. DDLSemanticAnlyzer  和 SeManticAnalyzer 分析

(1) DDLSemanticAnlyzer -->analyzeInternal -->不同的TOK 不同处理–>例如TOK_SHOWDATABASES -->analyzeShowDatabases --> rootTasks 添加DDLWork任务–> setFetchTask(获取返回的schema)

(2) SemanticAnlyzer–>analyzeInternnal --> doPhase1(分析AST树,AST拆分成查询子块) -->getMetaData(获取元数据信息) -->genOpTree(生成逻辑执行计划) -->Optimizer.optimize(优化逻辑执行计划)

     -->TaskCompile.compile(执行物理执行计划,此处可以选择MR,TEZ,Spark,通过TaskCompileFactory具体的去获取)

          compile的过程中会把任务放到rootTasks里。

5. doAuthorization

   doAuthorization --> isAuthorizationModeV2 -->getAuthorizationMode–>setupAuth–>通过hive.security.authenticator.manager 获取authenticator

   -->通过hive.security.authorization.manager 获取authorizer

    getAuthorizeProviderManager 来获取通过返回是否为null 来判断是auth V1 还是authV2 , 如果class 是继承HiveAuthorizationProvider那返回对应的class

     如果不是返回null。

     如果为null 通过HiveUtils.getAuthorizerFactory 获取授权Factory. 此时返回的是auth V2 版本。

6.编译后的execute执行

(1)通过hive.exec.pre.hooks  Get all the pre execution hooks and execute them

  (2) getRootTasks 获取 所有的task 

  (3)   将task 放入driverCxt 中(driverCxt.addToRunnable)

  (4)  通过TaskRuner 启动任务。

         TaskRunner.runSequential --> tsk.executeTask() -->execute(不同的task执行不同execute)

         任务类型:       可以查砍apache-hive-1.1.0-src\ql\src\java\org\apache\hadoop\hive\ql\exec\TaskFactory.java 中查看具体有哪些任务类型。

         主要DDLWork, FunctionWork, MapredWordk, TezWork(如果物理执行计划是通过tez)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值