織夢做響應(yīng)式網(wǎng)站網(wǎng)站收錄查詢工具
目錄
一、架構(gòu)及組件介紹
1.1 Hive底層架構(gòu)
1.2?Hive組件
1.3 Hive與Hadoop交互過程
二、Hive SQL 編譯成MR任務(wù)的流程
2.1?HQL轉(zhuǎn)換為MR源碼整體流程介紹
2.2?程序入口—CliDriver
2.3?HQL編譯成MR任務(wù)的詳細(xì)過程—Driver
2.3.1?將HQL語句轉(zhuǎn)換成AST抽象語法樹
詞法、語法解析
2.3.2?將AST轉(zhuǎn)換成TaskTree
語義解析
?生成邏輯執(zhí)行計劃
優(yōu)化邏輯執(zhí)行計劃
?生成物理執(zhí)行計劃
?HQL編譯成MapReduce具體原理
JOIN
?GROUP BY
DISTINCT
優(yōu)化物理執(zhí)行計劃?
2.3.3?提交任務(wù)并執(zhí)行
一、架構(gòu)及組件介紹
1) Hive簡介
- ?Hive是Facebook實現(xiàn)的一個開源的數(shù)據(jù)倉庫工具。
- 將結(jié)構(gòu)化的數(shù)據(jù)文件映射為數(shù)據(jù)庫表,并提供HQL查詢功能,將HQL語句轉(zhuǎn)化為MapReduce任務(wù)運(yùn)行
2) Hive本質(zhì):將 HQL 轉(zhuǎn)化成 MapReduce 程序
- Hive 處理的數(shù)據(jù)存儲在 HDFS
- Hive 分析數(shù)據(jù)底層的實現(xiàn)是 MapReduce
- 執(zhí)行程序運(yùn)行在 Yarn 上
1.1 Hive底層架構(gòu)
1.2?Hive組件
- 用戶接口:Client
- CLI:shell命令行
- JDBC/ODBC:Hive中的Thrift服務(wù)器允許外部客戶端通過網(wǎng)絡(luò)與Hive進(jìn)行交互,類似于JDBC或ODBC協(xié)議
- WEBUI:通過瀏覽器訪問Hive
- 元數(shù)據(jù):Metastore
- Hadoop
- 驅(qū)動器:Driver
- 解析器(SQL Parser):將 SQL 字符串轉(zhuǎn)換成抽象語法樹 AST,這一步一般都用第 三方工具庫完成,比如 antlr;對 AST 進(jìn)行語法分析,比如表是否存在、字段是否存在、SQL 語義是否有誤。
- 編譯器(Physical Plan):將 AST 編譯生成邏輯執(zhí)行計劃。
- 優(yōu)化器(Query Optimizer):對邏輯執(zhí)行計劃進(jìn)行優(yōu)化。
- 執(zhí)行器(Execution):把邏輯執(zhí)行計劃轉(zhuǎn)換成可以運(yùn)行的物理計劃。當(dāng)下Hive支持MapReduce、Tez、Spark3種執(zhí)行引擎
? ? Driver驅(qū)動器總結(jié):完成?HQL 查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,隨后執(zhí)行引擎調(diào)用執(zhí)行。當(dāng)下Hive支持MapReduce、Tez、Spark3種執(zhí)行引擎。
1.3 Hive與Hadoop交互過程
上圖的基本流程是:
- 步驟1:Client 客戶端調(diào)用 Driver的接口;
- 步驟2:Driver驅(qū)動器為查詢創(chuàng)建會話句柄,并將查詢發(fā)送到 Compiler(編譯器組件)生成執(zhí)行計劃;
- 步驟3和4:編譯器從元數(shù)據(jù)存儲庫中獲取本次查詢所需要的元數(shù)據(jù);
- 步驟5:編譯器生成各個階段Stage的執(zhí)行計劃,如果是一個MR任務(wù),該執(zhí)行計劃分為兩部分:Map Operator Tree(map端的執(zhí)行計劃樹)和Reduce Operator Tree(reduce端的執(zhí)行計劃樹),再將生成的邏輯執(zhí)行計劃發(fā)給Driver;
- 步驟6:Driver將邏輯執(zhí)行計劃發(fā)給執(zhí)行引擎Execution Engine;(將邏輯執(zhí)行計劃轉(zhuǎn)化成具體的物理執(zhí)行計劃,即mr任務(wù))
步驟6.1 / 6.2? /6.3 /6.4:執(zhí)行引擎將這些階段Stage的具體執(zhí)行內(nèi)容提交給對應(yīng)的組件。在每個 Task(mapper/reducer) 任務(wù)中,從HDFS文件中讀取與表相關(guān)的數(shù)據(jù),并通過算子樹依次傳遞。最終的數(shù)據(jù)集借助序列化器寫入到臨時的HDFS文件中。
- 步驟7、8:臨時HDFS文件的內(nèi)容由執(zhí)行引擎讀取后,通過Driver將查詢結(jié)果發(fā)送給Client 客戶端
簡化版本:
總結(jié):Hive通過給用戶提供的一系列交互接口,接收到用戶的指令(sql),使用自己的driver,結(jié)合元數(shù)據(jù)(metastore),將這些指令翻譯成 mapreduce任務(wù),提交到hadoop中執(zhí)行,最后將執(zhí)行返回的結(jié)果輸出到用戶交互接口。
二、Hive SQL 編譯成MR任務(wù)的流程
2.1?HQL轉(zhuǎn)換為MR源碼整體流程介紹
2.2?程序入口—CliDriver
我們執(zhí)行一個 HQL 語句通常有以下幾種方式:
- $HIVE_HOME/bin/hive進(jìn)入客戶端,然后執(zhí)行HQL;
- $HIVE_HOME/bin/hive -e “hql”;
- $HIVE_HOME/bin/hive -fhive.sql;
- 先開啟hivesever2服務(wù)端,然后通過JDBC方式連接遠(yuǎn)程提交HQL。
?可以知道我們執(zhí)行 HQL 主要依賴于 $HIVE_HOME/bin/hive? 和? $HIVE_HOME/bin/而在這兩個腳本中,最終啟動的 JAVA 程序的主類為“ org.apache.hadoop.hive.cli.CliDriver ” ,所以其實 Hive程序的入口就是“CliDriver ”這個類。
2.3?HQL編譯成MR任務(wù)的詳細(xì)過程—Driver
2.3.1?將HQL語句轉(zhuǎn)換成AST抽象語法樹
-
詞法、語法解析
? ? ? ? ??Antlr 定義 SQL 的語法規(guī)則,完成 SQL 詞法,語法解析,將 SQL 轉(zhuǎn)化為抽象語法樹 AST Tree;
?例如:AST如下圖:
2.3.2?將AST轉(zhuǎn)換成TaskTree
-
語義解析
? ? ? ? ?遍歷 AST Tree,抽象出一條SQL最基本組成單元 QueryBlock(查詢塊),該塊包括三個部分:輸入源,計算過程,輸出。簡單而言一個QueryBlock就是一個子查詢。
-
生成邏輯執(zhí)行計劃
? ? ? ? ?遍歷 QueryBlock,翻譯為執(zhí)行操作樹 OperatorTree(操作樹,也就是邏輯執(zhí)行計劃);Hive最終生成的MapReduce任務(wù),Map階段和Reduce階段均由OperatorTree組成。
基本的操作符包括:
- TableScanOperator
SelectOperator
FilterOperator
JoinOperator
GroupByOperator
ReduceSinkOperator
? ? ?Operator操作算子在Map Reduce階段之間的數(shù)據(jù)傳遞是一個流式的過程。每一個Operator對一行數(shù)據(jù)操作之后將數(shù)據(jù)傳遞給childOperator計算。
? ? ? 由于Join/GroupBy需要在Reduce階段完成,所以在生成相應(yīng)操作的Operator之前都會先生成一個ReduceSinkOperator,將字段組合并序列化為Reduce KeyReduce /value, Partition Key。
-
優(yōu)化邏輯執(zhí)行計劃
? ? ? 邏輯優(yōu)化器對OperatorTree(操作樹)進(jìn)行邏輯優(yōu)化。例如合并不必要的ReduceSinkOperator,減少數(shù)據(jù)傳輸及 shuffle 數(shù)據(jù)量;?
???????? ?Hive中的邏輯查詢優(yōu)化可以大致分為以下幾類:
投影修剪
謂詞下推
多路 Join
-
?生成物理執(zhí)行計劃
? ? ? ?遍歷 OperatorTree,轉(zhuǎn)換成TaskTree(任務(wù)樹,即物理執(zhí)行計劃)即MR任務(wù)。生成物理執(zhí)行計劃即是將邏輯執(zhí)行計劃生成的OperatorTree轉(zhuǎn)化為MapReduce Job的過程。
?HQL編譯成MapReduce具體原理
? (1) hive.fetch.task.conversion參數(shù)
?在Hive中,有些簡單任務(wù)既可以轉(zhuǎn)化為MR任務(wù),也可以Fetch本地抓取,即直接讀取table對應(yīng)的hdfs存儲目錄下文件得到結(jié)果,通過
hive.fetch.task.conversion
參數(shù)配置。默認(rèn)情況使用參數(shù)more,例如:SELECT
、FILTER
、LIMIT等簡單查找
都使用Fetch本地抓取,而其他復(fù)雜sql轉(zhuǎn)為MR任務(wù)。
?(2)轉(zhuǎn)化為MR任務(wù)的SQL
? ? ? ?需要轉(zhuǎn)換成MR任務(wù)的sql通常會涉及到key值的shuffle,例如:join、groupby、distinct等,接下來介紹此三種情況的sql轉(zhuǎn)化。
-
JOIN
JOIN
任務(wù)轉(zhuǎn)化為MR任務(wù)的流程如下:
- Map:?生成鍵值對,以join on 條件中的列作為key,以join之后所關(guān)心的列作為value值,在value中還會包含表的Tag信息,用于標(biāo)明此value對應(yīng)哪張表
- Shuffle:?根據(jù)key值進(jìn)行hash分區(qū), 按照hash值將鍵值對(key-value)發(fā)送到不同的reducer中
- Reduce:Reducer通過Tag來識別不同的表中的數(shù)據(jù),根據(jù)key值進(jìn)行join操作
? 以下列sql為例:
SELECT pageid, age
FROM page_view
JOIN userinfo
ON page_view.userid = userinfo.userid;
?sql轉(zhuǎn)化為mr任務(wù)流程如下圖:
-
?GROUP BY
? GROUP BY
任務(wù)轉(zhuǎn)化為MR任務(wù)的流程如下:
- Map:?生成鍵值對,以
GROUP BY
條件中的列作為key,以聚集函數(shù)的結(jié)果作為value- Shuffle:?根據(jù)key值進(jìn)行hash分區(qū), 按照hash值將鍵值對(key-value)發(fā)送到不同的reducer中
- Reduce:根據(jù)
SELECT
子句的列以及聚集函數(shù)進(jìn)行Reduce
以下列sql為例:
SELECT pageid,COUNT(1) as num
FROM page_view
GROUP BY pageid;
sql轉(zhuǎn)化為mr任務(wù)流程如下圖:
-
DISTINCT
? ? ? 與GROUP BY
操作相同,只是鍵值對中的value
可為空。
以下列sql為例:
SELECT DISTINCT pageid FROM page_view;
待補(bǔ)充~
-
優(yōu)化物理執(zhí)行計劃?
? ? ? ?物理優(yōu)化器對進(jìn)行TaskTree(任務(wù)樹,即物理執(zhí)行計劃)進(jìn)行物理優(yōu)化;
Hive中的物理優(yōu)化可以大致分為以下幾類:
分區(qū)修剪(Partition Pruning)
基于分區(qū)和桶的掃描修剪(Scan pruning)
在某些情況下,在 mapper端進(jìn)行?Group By分組的預(yù)聚合
在 mapper端執(zhí)行Join(map join)
如果是簡單的select查詢,可以設(shè)置為本地執(zhí)行,避免使用MapReduce作業(yè)
? ? 經(jīng)過2.3.1 及2.3.2 這六個階段,HQL就被解析映射成了集群上的 MR任務(wù)。
2.3.3?提交任務(wù)并執(zhí)行
- 獲取MR臨時工作目錄
- 定義Partitioner
- 定義Mapper和Reducer
- 實例化Job任務(wù)
- 提交Job任務(wù)并執(zhí)行