1. 程式人生 > >Hive系列之HSQL轉換成MapReduce過程

Hive系列之HSQL轉換成MapReduce過程

hive的庫、表等資料實際是hdfs系統中的目錄和檔案,讓開發者可以通過sql語句, 像操作關係資料庫一樣操作檔案內容, 比如執行查詢,統計,插入等操作。一直很好奇hive是如何做到這些的。
hive的整體架構圖如下所示, compiler部分負責把HiveSQL轉換成MapReduce任務。
Hive系列之HSQL轉換成MapReduce過程
基本轉換步驟
hiveSQL轉換成MapReduce的執行計劃包括如下幾個步驟:
HiveSQL ->AST(抽象語法樹) -> QB(查詢塊) ->OperatorTree(操作樹)->優化後的操作樹->mapreduce任務樹->優化後的mapreduce任務樹
Hive系列之HSQL轉換成MapReduce過程
SQL Parser:Antlr定義SQL的語法規則,完成SQL詞法,語法解析,將SQL轉化為抽象 語法樹AST Tree;
Semantic Analyzer:遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock;
Logical plan:遍歷QueryBlock,翻譯為執行操作樹OperatorTree;
Logical plan optimizer: 邏輯層優化器進行OperatorTree變換,合併不必要的ReduceSinkOperator,減少shuffle資料量;
Physical plan:遍歷OperatorTree,翻譯為MapReduce任務;
Logical plan optimizer:物理層優化器進行MapReduce任務的變換,生成最終的執行計劃;
step1: SQL Parser
如下圖所示, sql語句可以解析為三個部分
AST中第一個部分對應SQL語句中FROM access_log_hbase a JOIN product_hbase p ON (a.prono=p.prono)。
insert overwrite table對應第二部分。
select a.user, a.prono, p.maker, p.price對應第三部分。
Hive系列之HSQL轉換成MapReduce過程


step2: Semantic Analyzer
這個步驟把AST轉換成基本的查詢塊QB,如下圖所示
QB的物件包括如下屬性:
aliasToTabs:儲存表格別名的資訊
aliasToSubq:儲存子查詢的資訊
qbm:儲存每個輸入表的元資訊,比如表在HDFS上的路徑,儲存表資料的檔案格式等
QBParseInfo物件包括如下屬性:
joinExpr: 儲存TOK_JOIN節點資訊
destToxx:儲存輸出和各個操作的ASTNode節點的對應關係。
Hive系列之HSQL轉換成MapReduce過程
如下圖中, 表格別名a, p儲存到aliasTotabs, 分別對應“access_log_hbase", " product_hbase"。
TOK_JOIN資訊儲存到ParseInfo物件:joinExpr
Hive系列之HSQL轉換成MapReduce過程

下圖所示,TOK_DESTINATION節點儲存到nameToDest屬性中。
Hive系列之HSQL轉換成MapReduce過程
下圖所示,TOK_SELECT節點儲存到nameToDest屬性中。
Hive系列之HSQL轉換成MapReduce過程
step3:Logical Plan
該步驟是把查詢塊QB轉換操作樹。
操作樹基本的操作符包括TableScanOperator,SelectOperator,FilterOperator,JoinOperator,GroupByOperator,ReduceSinkOperator。
TableScanOperator: 掃描資料表中資料,從原表中取資料。
JoinOperator完成Join操作。
FilterOperator完成過濾操作, 對應sql裡面的where語句功能
ReduceSinkOperator:標誌著Hive Map階段的結束, Reduce階段的開始。
SelectOperator:reduce階段輸出select中的列
FileSinkOperator: 生成結果資料到輸出檔案。
從兩個輸入表格中讀入資料, 用operator樹表示為兩個TableScanOperator節點
Hive系列之HSQL轉換成MapReduce過程

Join放在reduce階段執行, 執行join節點前,加入兩個ReduceSinkOperator節點,表示當前map階段結束, 進入到reduce階段。
Hive系列之HSQL轉換成MapReduce過程
selectoperator節點,從reduce節點獲取select指定的列值。
Hive系列之HSQL轉換成MapReduce過程
nameToDest ASTNode節點,轉換為FileSinkOperator節點, 把結果寫入到目標檔案。
Hive系列之HSQL轉換成MapReduce過程
通過上面幾個轉換步驟, 最終生成的logical計劃樹。
Hive系列之HSQL轉換成MapReduce過程
logical plan tree還可以通過logical plan optimizer進一步優化, 優化完成的邏輯優化樹還有轉換成物理執行計劃和物理執行計劃優化。本文不做詳細介紹, 後續有時間再補充。
PS: 檢視hive sql編譯後的執行計劃
hive> explain select * from tablename;