hive的庫、表等數據實際是hdfs系統中的目錄和文件,讓開發者可以通過sql語句, 像操作關系數據庫一樣操作文件內容, 比如執行查詢,統計,插入等操作。一直很好奇hive是如何做到這些的。通過參考網上幾篇不錯的文檔, 有點小心得分享出來。主要的參考鏈接 http://tech.meituan.com/hive-sql-to-mapreduce.html http://www.slideshare.net/recruitcojp/internal-hive 注明:本文的圖片借用slideshare內容。
hive的整體架構圖如下所示, compiler部分負責把HiveSQL轉換成MapReduce任務。

基本轉換步驟 hiveSQL轉換成MapReduce的執行計划包括如下幾個步驟: HiveSQL ->AST(抽象語法樹) -> QB(查詢塊) ->OperatorTree(操作樹)->優化后的操作樹->mapreduce任務樹->優化后的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對應第三部分。

step2: Semantic Analyzer 這個步驟把AST轉換成基本的查詢塊QB,如下圖所示 QB的對象包括如下屬性: aliasToTabs:保存表格別名的信息 aliasToSubq:保存子查詢的信息 qbm:保存每個輸入表的元信息,比如表在HDFS上的路徑,保存表數據的文件格式等
QBParseInfo對象包括如下屬性: joinExpr: 保存TOK_JOIN節點信息 destToxx:保存輸出和各個操作的ASTNode節點的對應關系。

如下圖中, 表格別名a, p保存到aliasTotabs, 分別對應“access_log_hbase", " product_hbase"。 TOK_JOIN信息保存到ParseInfo對象:joinExpr

下圖所示,TOK_DESTINATION節點保存到nameToDest屬性中。

下圖所示,TOK_SELECT節點保存到nameToDest屬性中。

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節點

Join放在reduce階段執行, 執行join節點前,加入兩個ReduceSinkOperator節點,表示當前map階段結束, 進入到reduce階段。

selectoperator節點,從reduce節點獲取select指定的列值。

nameToDest ASTNode節點,轉換為FileSinkOperator節點, 把結果寫入到目標文件。

通過上面幾個轉換步驟, 最終生成的logical計划樹。

logical plan tree還可以通過logical plan optimizer進一步優化, 優化完成的邏輯優化樹還有轉換成物理執行計划和物理執行計划優化。本文不做詳細介紹, 后續有時間再補充。
PS: 查看hive sql編譯后的執行計划 hive> explain select * from tablename;
參考文檔: http://tech.meituan.com/hive-sql-to-mapreduce.html http://www.slideshare.net/recruitcojp/internal-hive http://lxw1234.com/archives/2015/09/476.htm