Hive元件以及執行過程

2021-09-08 20:28:41 字數 3498 閱讀 7696

對hive的基本組成進行了總結:

1、元件:

元儲存(metastore )-儲存「系統目錄以及關於表、列、分割槽等的元資料」的元件。

驅動(driver )- 控制 hiveql 生命週期的元件,當 hiveql 查詢穿過 hive時。該驅動管理著會話控制代碼以及任何會話的統計。

查詢編譯器(query compiler) - 是乙個元件,將hiveql編譯成有向無環圖(directed acyclic graph, dag)形式的map/reduce任務。

執行引擎 execution engine - 是乙個元件,依相依性順序(dependency order)執行由編譯器產生的任務。

hive 伺服器 hiveserver - 乙個提供「健壯的介面(thrift inte***ce )、jdbc/odbc 伺服器以及提供一種整合 hive 和其它應用的」元件。

客戶端元件 -類似命令列介面cli(command line inte***ce), web ui 以及jdbc/odbc驅動。包含了正反序列化(serde)以及物件觀察器(objectinspector)介面的可擴充套件介面,類似於前述使用者定義函式 udf (user defined function)以及使用者定義聚合函式udaf(user defined aggregatefunction)介面,允許使用者定義自己的列函式。

2、執行的過程:

hiveql通過cli/web ui或者thrift 、 odbc 或 jdbc介面的外部介面提交,經過complier編譯器,運用metastore中的雲資料進行型別檢測和語法分析,生成乙個邏輯方案(logical plan),然後通過簡單的優化處理,產生乙個以有向無環圖dag資料結構形式展現的map-reduce任務

3、元儲存(metastore)

儲存列所有關於表、表的分割槽、模式、列及其型別、表位址等的表的元資料,可以通過thrift介面查詢得到,由於需要快速的提供到編譯器中,所以使用rdbms

4、查詢編譯器(query complier)

用雲儲存中的元資料來生成執行計畫,步驟如下:

1).解析(parse)-anlr解析其生成語法樹ast(hibernate也是這個):將hql轉化為抽象語法樹ast

2).型別檢查和語法分析(type checking and semantic analysis):將抽象語法樹轉換此查詢塊(query block tree),並將查詢塊轉換成邏輯查詢計畫(logic plan generator);

3).優化(optimization):重寫查詢計畫(logical optimizer)-->將邏輯查詢計畫轉成物理計畫(physical plan generator)-->選擇最佳的join策略(physical optimizer)

parse   sa    lpg       lo        ppg       po

hql------->ast------>qb----->op tree------->op tree------->task tree------->task tree

首先進行hql語句解析,構造一顆ast樹,從ast樹中得到queryblock,再將qb轉為對應的操作符,生成邏輯查詢計畫,對邏輯查詢計畫進行優化(謂詞下推),生成物理查詢計畫,對物理查詢計畫進行優化(mapjoinresolver/skewjoinresolver/commonjoinresolver),得到最後的執行計畫。

mapjoinresolver:將小表的mr結果放入hashtablefiles-->distributedcache,大表從分布式快取中取得資料進行join;當hash資料較大時,分布式快取查詢效率降低,同時大表的map都》在等待hash files;所以對其進行列優化處理小表的結果放到dc中進行壓縮和更新,大表遍歷時從dc中取出tar包》,然後解壓讀取本地的hash files

hive完成列以下轉換,作為優化階段的一部分:

1).列剪輯(column pruning):查詢處理中唯一需要的列確實從行中投射出去

2).謂語下推(predicate pushdown):將只於一張表有關的過濾操作下推至tablescanoperator之後,

3).分割槽剪輯(partition pruning):過濾掉分割槽上不符合條件的字段

4).map 端的連線(map side joins):當join的表很小時,在map段先複製它然後再進行join,格式如下:

select /*+ mapjoin(t2) */ t1.c1, t2.c1 from t1 join t2 on(t1.c2 = t2.c2);

由hive.mapjoin.size.key以及hive.mapjoin.cache.numrows控制「任何時間儲存在記憶體中的」表中行的數量,以及提供給系統聯合鍵的大小

5).連線再排序(join reordering):把較小的表儲存在記憶體中,較大的表進行遍歷操作,保證系統記憶體不溢位

5、mapjoin的進一步優化

1).資料再分割槽以把控groupby形成的非對稱(skews):用兩個mapreduce來做,第乙個階段將資料隨機分發(或者按distinct列分發在distinct聚合的情況下)至reducers,並且計算聚合值;然後這些聚合結果按照group by 列分發給在第二個reducer;

set hive.groupby.skewindata= true ;

select t1.c1, sum(t1.c2)

from t1

group by t1.c1;

6、執行引擎(execution engine):

按照任務的依賴關係序列來執行

7.其它優化:

1).left semi join實現in/exists子查詢:

select a.* from a left semi join b on(a.key = b.key and b.key > 100);

等同於select a.* from a where a.key in(select b.key form b where b.key > 100);

作用:map端用group by減少流入reduce端的資料量

2).bucket map join:

set hive.optimize.bucketmapjoin = true;

和map join一起工作;

所有join的表都做列分桶,同時大表桶的數量是小表桶的整數倍;

做bucket的列必須是join的列;

select /*+mapjoin(a,c)*/ a.*, b.*, c.*

a join b on a.key = b.key

join c on a.key=c.key;

在現實的生產環境中,會有成百上千個buckets;

3).skew join:

join時資料傾斜,造成reduce端oom

set hive.optimize.skewjoin = true;

set hive.skewjoin.key = 閥值;

當join得到的map超過閥值時,將記憶體中的a-k1/b-k1資料分別存入hdfs中,然後遍歷完後再對hdfs上的兩塊資料做map join,和其它key一起組成最後結果

Hive總結(三)hive元件和執行過程

對hive的基本組成進行了總結 1 元件 元儲存 metastore 儲存 系統目錄以及關於表 列 分割槽等的元資料 的元件。驅動 driver 控制 hiveql 生命週期的元件,當 hiveql 查詢穿過 hive時。該驅動管理著會話控制代碼以及任何會話的統計。查詢編譯器 query compi...

Hive總結(三)hive元件和執行過程

對hive的基本組成進行了總結 1 元件 元儲存 metastore 儲存 系統目錄以及關於表 列 分割槽等的元資料 的元件。驅動 driver 控制 hiveql 生命週期的元件,當 hiveql 查詢穿過 hive時。該驅動管理著會話控制代碼以及任何會話的統計。查詢編譯器 query compi...

Hive元件及Hive執行流程

元儲存 metastore 儲存 系統目錄以及關於表 列 分割槽等的元資料 的元件。驅動 driver 控制 hiveql 生命週期的元件,當 hiveql 查詢穿過 hive時。該驅動管理著會話控制代碼以及任何會話的統計。查詢編譯器 query compiler 是乙個元件,將hiveql編譯成有...