一、簡述
HiveQL是一種聲明式語言,用戶提交查詢,而Hive會將其轉換成MapReduce job,如下圖。一般來說大部分時間可以無視這個執行過程的內部邏輯,但是如果能了解這些底層實現細節,在調優的時候就會更得心應手。
二、過程
將HiveQL轉化為MapReduce任務,整個編譯過程主要分為六個階段:
- Antlr定義SQL的語法規則,完成SQL詞法,語法解析,將SQL轉化為抽象語法樹AST;
- 遍歷AST,抽象出查詢的基本組成單元查詢塊QueryBlock;
- 遍歷QueryBlock,將QueryBlock轉化為邏輯查詢計划OperatorTree;
- 邏輯層優化器進行OperatorTree變換,合並不必要的ReduceSinkOperator,減少shuffle數據量;
- 遍歷OperatorTree,翻譯為MapReduce任務;
- 物理層優化器進行MapReduce任務的變換,生成最終的執行計划。
1. 將SQL轉為AST
(1)ANTLR(Another Tool for Language Recognition)
是一個語法分析器(Parser),可以用來構造領域語言。它允許我們定義識別字符流的詞法規則和用於解釋Token流的語法分析規則,然后,ANTLR將根據用戶提供的語法文件自動生成相應的詞法/語法分析器。用戶可以利用他們將輸入的文本進行編譯,並轉換成其他形式,如AST。
(2)AST(Abstract Syntax Tree)
AST表明Hive是如何將查詢解析成token(符號)和literal(字面值)的,以下面的HQL為例:
select sum(number) from onecol;
轉化為AST的形式為:
ABSTRACT SYNTAX TREE; (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME onecol))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION sum (TOK_TABLE_OR_COL number))))))
2. 語義分析(Semantics Analyze)
這個過程主要是遍歷AST,抽象出查詢的基本組成單元查詢塊QueryBlock。
QueryBlock是一條SQL最基本的組成單元,包括三個部分:輸入源,計算過程,輸出。簡單來講一個QueryBlock就是一個子查詢。
3. 將QueryBlock轉化為OperatorTree
遍歷QueryBlock,生成OperatorTree,OperatorTree由很多邏輯操作符組成,如TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator和ReduceSinkOperator等。這些邏輯操作符可在Map、Reduce階段完成某一特定操作。
4. 優化OperatorTree
Hive驅動模塊中的邏輯優化器對OperatorTree進行優化,變換OperatorTree的形式,合並多余的操作符,減少MR任務數、以及Shuffle階段的數據量;
5. 翻譯為MapReduce任務
遍歷優化后的OperatorTree,根據OperatorTree中的邏輯操作符生成需要執行的MR任務。
6. 生成最終執行計划
啟動Hive驅動模塊中的物理優化器,對生成的MR任務進行優化,生成最終的MR任務執行計划。
整體流程如下:
Hive驅動模塊中的執行器執行最終的MR任務時,Hive本身不會生成MR算法程序。它通過一個表示“Job執行計划”的XML文件,來驅動內置的、原生的Mapper和Reducer模塊。Hive通過和JobTracker通信來初始化MR任務,而不需直接部署在JobTracker所在管理節點上執行。通常在大型集群中,會有專門的網關機來部署Hive工具,這些網關機的作用主要是遠程操作和管理節點上的JobTracker通信來執行任務。Hive要處理的數據文件常存儲在HDFS上,HDFS由名稱節點(NameNode)來管理。
三、參考
1. antlr
(完)