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