對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執行流程
元儲存 metastore 儲存 系統目錄以及關於表 列 分割槽等的元資料 的元件。驅動 driver 控制 hiveql 生命週期的元件,當 hiveql 查詢穿過 hive時。該驅動管理著會話控制代碼以及任何會話的統計。查詢編譯器 query compiler 是乙個元件,將hiveql編譯成有...
Hive總結(五)hive日誌
日誌記錄了程式執行的過程,是一種查詢問題的利器。hive中的日誌分為兩種 1.系統日誌,記錄了hive的運 況,錯誤狀況。2.job 日誌,記錄了hive 中job的執行的歷史過程。系統日誌儲存在什麼地方呢 在hive conf hive log4j.properties 檔案中記錄了hive日誌的...