hive的庫三圆、表等數(shù)據(jù)實際是hdfs系統(tǒng)中的目錄和文件,讓開發(fā)者可以通過sql語句避咆, 像操作關(guān)系數(shù)據(jù)庫一樣操作文件內(nèi)容舟肉, 比如執(zhí)行查詢,統(tǒng)計查库,插入等操作路媚。一直很好奇hive是如何做到這些的。通過參考網(wǎng)上幾篇不錯的文檔樊销, 有點小心得分享出來整慎。主要的參考鏈接
http://tech.meituan.com/hive-sql-to-mapreduce.html
http://www.slideshare.net/recruitcojp/internal-hive
注明:本文的圖片借用slideshare內(nèi)容。
hive的整體架構(gòu)圖如下所示围苫, compiler部分負責(zé)把HiveSQL轉(zhuǎn)換成MapReduce任務(wù)裤园。
基本轉(zhuǎn)換步驟
hiveSQL轉(zhuǎn)換成MapReduce的執(zhí)行計劃包括如下幾個步驟:
HiveSQL ->AST(抽象語法樹) -> QB(查詢塊) ->OperatorTree(操作樹)->優(yōu)化后的操作樹->mapreduce任務(wù)樹->優(yōu)化后的mapreduce任務(wù)樹
SQL Parser:Antlr定義SQL的語法規(guī)則,完成SQL詞法够吩,語法解析比然,將SQL轉(zhuǎn)化為抽象 語法樹AST Tree;
Semantic Analyzer:遍歷AST Tree周循,抽象出查詢的基本組成單元QueryBlock强法;
Logical plan:遍歷QueryBlock万俗,翻譯為執(zhí)行操作樹OperatorTree;
Logical plan optimizer: 邏輯層優(yōu)化器進行OperatorTree變換饮怯,合并不必要的ReduceSinkOperator闰歪,減少shuffle數(shù)據(jù)量;
Physical plan:遍歷OperatorTree蓖墅,翻譯為MapReduce任務(wù)库倘;
Logical plan optimizer:物理層優(yōu)化器進行MapReduce任務(wù)的變換,生成最終的執(zhí)行計劃论矾;
step1: SQL Parser
如下圖所示教翩, sql語句可以解析為三個部分
AST中第一個部分對應(yīng)SQL語句中FROM access_log_hbase a JOIN product_hbase p ON (a.prono=p.prono)。
insert overwrite table對應(yīng)第二部分贪壳。
select a.user, a.prono, p.maker, p.price對應(yīng)第三部分饱亿。
step2: Semantic Analyzer
這個步驟把AST轉(zhuǎn)換成基本的查詢塊QB,如下圖所示
QB的對象包括如下屬性:
aliasToTabs:保存表格別名的信息
aliasToSubq:保存子查詢的信息
qbm:保存每個輸入表的元信息闰靴,比如表在HDFS上的路徑彪笼,保存表數(shù)據(jù)的文件格式等
QBParseInfo對象包括如下屬性:
joinExpr: 保存TOK_JOIN節(jié)點信息
destToxx:保存輸出和各個操作的ASTNode節(jié)點的對應(yīng)關(guān)系。
如下圖中蚂且, 表格別名a, p保存到aliasTotabs, 分別對應(yīng)“access_log_hbase", " product_hbase"配猫。
TOK_JOIN信息保存到ParseInfo對象:joinExpr
下圖所示,TOK_DESTINATION節(jié)點保存到nameToDest屬性中杏死。
下圖所示泵肄,TOK_SELECT節(jié)點保存到nameToDest屬性中。
step3:Logical Plan
該步驟是把查詢塊QB轉(zhuǎn)換操作樹淑翼。
操作樹基本的操作符包括TableScanOperator凡伊,SelectOperator,F(xiàn)ilterOperator窒舟,JoinOperator,GroupByOperator诵盼,ReduceSinkOperator惠豺。
TableScanOperator: 掃描數(shù)據(jù)表中數(shù)據(jù),從原表中取數(shù)據(jù)风宁。
JoinOperator完成Join操作洁墙。
FilterOperator完成過濾操作, 對應(yīng)sql里面的where語句功能
ReduceSinkOperator:標志著Hive Map階段的結(jié)束戒财, Reduce階段的開始热监。
SelectOperator:reduce階段輸出select中的列
FileSinkOperator: 生成結(jié)果數(shù)據(jù)到輸出文件。
從兩個輸入表格中讀入數(shù)據(jù)饮寞, 用operator樹表示為兩個TableScanOperator節(jié)點
Join放在reduce階段執(zhí)行孝扛, 執(zhí)行join節(jié)點前列吼,加入兩個ReduceSinkOperator節(jié)點,表示當前map階段結(jié)束苦始, 進入到reduce階段寞钥。
selectoperator節(jié)點,從reduce節(jié)點獲取select指定的列值陌选。
nameToDest ASTNode節(jié)點理郑,轉(zhuǎn)換為FileSinkOperator節(jié)點, 把結(jié)果寫入到目標文件咨油。
通過上面幾個轉(zhuǎn)換步驟您炉, 最終生成的logical計劃樹。
logical plan tree還可以通過logical plan optimizer進一步優(yōu)化役电, 優(yōu)化完成的邏輯優(yōu)化樹還有轉(zhuǎn)換成物理執(zhí)行計劃和物理執(zhí)行計劃優(yōu)化赚爵。本文不做詳細介紹, 后續(xù)有時間再補充宴霸。
PS: 查看hive sql編譯后的執(zhí)行計劃
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