Loading

Hive源码解析

date: 2020-07-08 15:12:00
updated: 2020-08-21 17:38:00

Hive源码解析

入口:hive-cli-1.1.0-cdh5.14.4.jar!/org/apache/hadoop/hive/cli/CliDriver.class

参考文档

1. 启动

命令行输入 hive 后,启动log进程,建立一个客户端Session,获取到服务器的hive conf配置文件,启动客户端

启动后 executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc) 一直监听输入的 line; line 会按照 ; 来进行分割拼接成 command,对每一个 command 依次进行处理。command 一共分四种情况:① quit\exit ② source FilePath 指定执行某个文件里的语句 ③ 以 ! 开头的 shell 命令 ④ 本地客户端的各种命令(processLocalCmd(String cmd, CommandProcessor proc, CliSessionState ss))

通过读取 conf 配置,拿到 Driver 信息,然后交给对应的 Driver 来执行命令:org.apache.hadoop.hive.ql.Driver.compile(String command, boolean resetTaskIds, boolean deferClose)

2. 解析命令

在 Driver 拿到命令后,runInternal(command, alreadyCompiled); 判断是否已经编译过,如果没有的话,首先要进行语法解析,通过 org.apache.hadoop.hive.ql.parse.parseDriver.parse(String command, Context ctx) 生成 AST(AbstractSyntaxTree) 抽象语法树

在 parse 目录下存放5个文件
- HiveLexer.g :定义Hive关键字,及组成词组的合法字符
    定义的规则如下:
    ```
    KW_SELECT : 'SELECT';
    KW_WHERE : 'WHERE';
    KW_FROM : 'FROM';
    fragment
    Letter
        : 'a'..'z' | 'A'..'Z'
        ;
    ```
- SelectClauseParser.g :定义select语句的语法规则
- FromClauseParser.g :定义from语句的语法规则
- IdentifiersParser.g :定义函数、group等的语法规则
- HiveParser.g:定义语法规则文件,引入了其他语法规则文件

BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(this.conf, tree); 对拿到的AST进行解析
this.schema = getSchema(sem, this.conf); 返回Hive表的字段信息
this.plan = new QueryPlan(queryStr, sem, perfLogger.getStartTime("Driver.run"), queryId, SessionState.get().getHiveOperation(), this.schema, this.queryDisplay); 生成执行计划
this.plan.getFetchTask().initialize(this.conf, this.plan, (DriverContext)null); 对执行计划中拉取数据的任务进行初始化

针对 QueryPlan,调用 Driver.exexute() 执行job

String queryId = this.conf.getVar(ConfVars.HIVEQUERYID);
String queryStr = HiveConf.getVar(this.conf, ConfVars.HIVEQUERYSTRING);

3. Hive 可使用的函数

hive-exec 包下 org.apache.hadoop.hive.ql.exec.FunctionRegistry.java

posted @ 2020-10-22 11:03  猫熊小才天  阅读(1562)  评论(0编辑  收藏  举报