1. Hive的本質(zhì)
Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,它的本質(zhì)是將HQL語(yǔ)句轉(zhuǎn)化成MapReduce程序.在它的底層,HDFS負(fù)責(zé)存儲(chǔ)數(shù)據(jù),YARN負(fù)責(zé)進(jìn)行資源管理,MapReduce負(fù)責(zé)數(shù)據(jù)處理.
2.Hive架構(gòu)

架構(gòu)組成:
(1) 用戶接口(Client):
ClientCLI(hive shell)、JDBC/ODBC(java訪問(wèn)hive),WEBUI(瀏覽器訪問(wèn)hive)
(2) 元數(shù)據(jù)(Metastore):
Metastore元數(shù)據(jù)包括:表名、表所屬的數(shù)據(jù)庫(kù)(默認(rèn)是default)、表的擁有者、列/分區(qū)字段、表的類型(是否是外部表)、表的數(shù)據(jù)所在目錄等;默認(rèn)存儲(chǔ)在自帶的derby數(shù)據(jù)庫(kù)中,推薦使用采用關(guān)系型數(shù)據(jù)庫(kù)MySQL存儲(chǔ)Metastore;
(3) 驅(qū)動(dòng)器(Driver)包含:解析器、編譯器、優(yōu)化器、執(zhí)行器;
- 解析器:將SQL字符串轉(zhuǎn)換成抽象語(yǔ)法樹(shù)AST,這一步一般都用第三方工具庫(kù)完成,比如antlr;對(duì)AST進(jìn)行語(yǔ)法分析,比如表是否存在、字段是否存在、SQL語(yǔ)義是否有誤(比如select中被判定為聚合的字段在group by中是否有出現(xiàn));
- 編譯器:將抽象語(yǔ)法樹(shù)AST編譯生成邏輯執(zhí)行計(jì)劃;
- 優(yōu)化器:對(duì)邏輯執(zhí)行計(jì)劃進(jìn)行優(yōu)化;
- 執(zhí)行器:把邏輯執(zhí)行計(jì)劃轉(zhuǎn)換成可以運(yùn)行的物理計(jì)劃。對(duì)于Hive來(lái)說(shuō),就是MR/TEZ/Spark.
(4) Hive使用HDFS存儲(chǔ)數(shù)據(jù).
Hive本身不存在數(shù)據(jù),Hive雖有表的定義但表是純的邏輯表,數(shù)據(jù)是存在HDFS上的.HIVE中的內(nèi)容不支持改寫(xiě)和刪除,適合讀多寫(xiě)少的場(chǎng)景.
3.Hive執(zhí)行流程
如上圖所示,我們通過(guò)Hive提供的一系列交互接口(Client),向Hive提交SQL指令(HSQL).如果我們提交的是創(chuàng)建表的DDL語(yǔ)句(數(shù)據(jù)定義語(yǔ)言),Hive會(huì)通過(guò)使用自己的執(zhí)行引擎(Driver)將數(shù)據(jù)表的信息記錄在Metastore元數(shù)據(jù)組件中,正如上面提到的,元數(shù)據(jù)組件通常用一個(gè)關(guān)系型數(shù)據(jù)庫(kù)實(shí)現(xiàn),其記錄著表名,字段名,字段類型以及關(guān)聯(lián)的HDFS文件路徑等元信息.
如果我們提交的是DQL語(yǔ)句(數(shù)據(jù)查詢分析語(yǔ)句),Hive的執(zhí)行引擎(Drive)會(huì)結(jié)合元數(shù)據(jù)信息對(duì)該語(yǔ)句進(jìn)行轉(zhuǎn)換,語(yǔ)法分析,語(yǔ)法優(yōu)化等操作,最后生成一個(gè)MapReduce執(zhí)行計(jì)劃.
說(shuō)具體一點(diǎn),就是Hive執(zhí)行引擎(Drive)會(huì)將該語(yǔ)句提交給自己的解析器(SQL Parser),解析器接收到語(yǔ)句之后,會(huì)將SQL查詢字符串轉(zhuǎn)換成抽象語(yǔ)法樹(shù),并對(duì)抽象語(yǔ)法樹(shù)進(jìn)行語(yǔ)法分析,比如檢測(cè)表是否存在,字段是否存在,SQL語(yǔ)義是否有誤等,之后將經(jīng)過(guò)語(yǔ)法分析后的抽象語(yǔ)法樹(shù)提交給編譯器.
編譯器再將抽象語(yǔ)法樹(shù)編程成邏輯執(zhí)行計(jì)劃(Physical Plan),然后再由優(yōu)化器(Query Optimizer)對(duì)邏輯執(zhí)行計(jì)劃進(jìn)行優(yōu)化,最后由執(zhí)行器(Execution)將邏輯執(zhí)行計(jì)劃轉(zhuǎn)換成可以運(yùn)行的物理計(jì)劃,也即是MapReduce執(zhí)行計(jì)劃,然后再根據(jù)執(zhí)行計(jì)劃生成一個(gè)MapReduce的作業(yè),提交到Y(jié)arn上執(zhí)行,最后,將執(zhí)行返回的結(jié)果輸出到用戶交互接口.
Hive內(nèi)部預(yù)置了很多函數(shù),Hive的執(zhí)行計(jì)劃就是根據(jù)用戶提交的HQL語(yǔ)句生成這些函數(shù)的DAG(有向無(wú)環(huán)圖),然后封裝進(jìn)MapReduce的map和reduce函數(shù)中.