Hive的執行計劃描述了一個hiveSQL語句的具體執行步驟,通過執行計劃解讀可以瞭解hiveSQL語句被解析器轉換為相應程式語言的執行邏輯。通過執行邏輯可以知曉HiveSQL執行流程,進而對流程進行優化,實現更優的資料查詢處理。
同樣,通過執行計劃,還可以瞭解到哪些不一樣的SQL邏輯其實是等價的,哪些看似一樣的邏輯其實是執行代價完全不一樣。
如果說Hive優化是一堵技術路上的高牆,那麼關於Hive執行計劃,就是爬上這堵高牆的一架梯子。
不同版本的Hive會採用不同的方式生成的執行計劃。主要區別就是基於規則生成hive執行計劃,和基於成本代價來生成執行計劃。而hive早期版本是基於規則生成執行計劃,在Hive0.14及之後的版本都是基於成本代價來生成執行計劃,這主要是整合了Apache Calcite。Apache Calcite具體可以檢視官網介紹。
兩種方式的優劣顯而易見,基於規則生成執行計劃,作為使用方來說,叢集的環境,資料量的大小完全不一樣,同樣的規則邏輯,執行起來差異巨大,因此會對開發者有更高的優化要求。Hive基於成本代價來生成執行計劃,這種方式能夠結合Hive後設資料資訊和Hive執行過程收集到的各類儲存統計資訊推測出一個更合理的執行計劃。也就是說Hive本身已經為我們的SQL語句做了一輪優化了,可以預見的將來,Hive還會具備更多的優化能力。
Hive執行計劃是一個預估的執行計劃,只有在SQL實際執行後才會獲取到真正的執行計劃,而一些關係型資料庫中,會提供真實的SQL執行計劃。如SQLserver和Oracle等。
Hive提供的執行計劃使用語法如下:
EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query
以上內容重點關注explain,explain extend,explain dependency,explain authorization,explain vectorization。
一個HIVE查詢被轉換為一個由一個或多個stage組成的序列(有向無環圖DAG)。這些stage可以是MapReduce stage,也可以是負責後設資料儲存的stage,也可以是負責檔案系統的操作(比如移動和重新命名)的stage。
在查詢SQL語句前加上關鍵字explain用來檢視執行計劃的基本資訊。
可以看如下範例的執行計劃結果解析:
範例SQL
-- 本文預設使用mr計算引擎
explain
-- 統計年齡小於30歲各個年齡裡,暱稱裡帶「小」的人數
select age,count(0) as num from temp.user_info_all where ymd = '20230505'
and age < 30 and nick like '%小%'
group by age;
執行計劃:
# 描述任務之間stage的依賴關係
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1
# 每個stage詳細資訊
STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: user_info_all
Statistics: Num rows: 32634295 Data size: 783223080 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: ((age < 30) and (nick like '%小%')) (type: boolean)
Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: age (type: bigint)
outputColumnNames: age
Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
Group By Operator
aggregations: count(0)
keys: age (type: bigint)
mode: hash
outputColumnNames: _col0, _col1
Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
Reduce Output Operator
key expressions: _col0 (type: bigint)
sort order: +
Map-reduce partition columns: _col0 (type: bigint)
Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
value expressions: _col1 (type: bigint)
Reduce Operator Tree:
Group By Operator
aggregations: count(VALUE._col0)
keys: KEY._col0 (type: bigint)
mode: mergepartial
outputColumnNames: _col0, _col1
Statistics: Num rows: 2719524 Data size: 65268576 Basic stats: COMPLETE Column stats: NONE
File Output Operator
compressed: true
Statistics: Num rows: 2719524 Data size: 65268576 Basic stats: COMPLETE Column stats: NONE
table:
input format: org.apache.hadoop.mapred.SequenceFileInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink
我們將上述結果拆分看,先從最外層開始,包含兩個大的部分:
stage dependencies: 各個stage之間的依賴性
stage plan: 各個stage的執行計劃
先看第一部分 stage dependencies ,包含兩個 stage,Stage-1 是根stage,說明這是開始的stage,Stage-0 依賴 Stage-1,Stage-1執行完成後執行Stage-0。
一些Hive執行邏輯的視覺化工具頁面就是利用該語句資訊繪畫出Hive執行流程圖以及相關進度資訊。
再看第二部分 stage plan,裡面有一個 Map Reduce,一個MR的執行計劃分為兩個部分:
這兩個執行計劃樹裡面包含這條sql語句的 operator:
map端Map Operator Tree資訊解讀:
TableScan 對關鍵字alias宣告的結果集進行表掃描操作。
alias: 表名稱
Statistics: 表統計資訊,包含表中資料條數,資料大小等
Filter Operator:過濾操作,表示在之前的表掃描結果集上進行資料過濾。
predicate:過濾資料時使用的謂詞(過濾條件),如sql語句中的and age < 30,則此處顯示(age < 30),什麼是謂詞,以及優化點,可以詳細看之前一篇文章謂詞下推。
Statistics:過濾後資料條數和大小。
Select Operator: 對列進行投影,即篩選列,選取操作。
expressions:篩選的列名稱及列型別
outputColumnNames:輸出的列名稱
Statistics:篩選列後表統計資訊,包含表中資料條數,資料大小等。
Group By Operator:分組聚合操作。
aggregations:顯示聚合函數資訊,這裡使用count(0)
。
keys:表示分組的列,如果沒有分組,則沒有此欄位。
mode:聚合模式,值有 hash:隨機聚合;mergepartial:合併部分聚合結果;final:最終聚合
outputColumnNames:聚合之後輸出列名,_col0對應的是age列, _col1對應的是count(0)列。
Statistics: 表統計資訊,包含分組聚合之後的資料條數,資料大小。
Reduce Output Operator:輸出到reduce操作結果集資訊。
key expressions:MR計算引擎,在map和reduce階段的輸出都是key-value形式,這裡描述的是map端輸出的鍵使用的是哪個資料列。_col0對應的是age列。
sort order:值為空不排序;值為 + 正序排序,值為 - 倒序排序;值為 +- 排序的列為兩列,第一列為正序,第二列為倒序,以此類推多值排序。
Map-reduce partition columns:表示Map階段輸出到Reduce階段的分割區列,在HiveSQL中,可以用distribute by指定分割區的列。這裡預設為_col0對應的是age列。
Statistics:輸出結果集的統計資訊。
value expressions:對應key expressions,這裡是value值欄位。_col1對應的是count(0)列。
接下來是reduce階段Reduce Operator Tree,出現和map階段關鍵詞一樣的,其含義是一致的,羅列一下map階段未出現的關鍵詞。
File Output Operator:檔案輸出操作。
compressed:表示輸出結果是否進行壓縮,true壓縮,false不壓縮。
table:表示當前操作表的資訊。
input format:輸入檔案型別。
output format:輸出檔案型別。
serde:讀取表資料的序列化和反序列化方式。
Stage-0的操作資訊。
Fetch Operator:使用者端獲取資料操作。
limit:值為-1標識不限制條數,其他值為限制的條數。
Processor Tree:處理器樹
ListSink:資料展示。
可以根據上述執行計劃通過流程圖來描述一下hiveSQL的執行邏輯過程。
通過上圖可以很清晰的瞭解一個hiveSQL的執行邏輯過程,便於理解hive資料流轉過程。
explain extended可以檢視explain的擴充套件資訊,主要包含三個部分內容:
explain extended
-- 統計年齡小於30歲各個年齡裡,暱稱裡帶「小」的人數
select age,count(0) as num from temp.user_info_all where ymd = '20230505'
and age < 30 and nick like '%小%'
group by age;
下一期:Hive執行計劃之hive依賴及許可權查詢和常見使用場景
按例,歡迎點選此處關注我的個人公眾號,交流更多知識。
後臺回覆關鍵字 hive,隨機贈送一本魯邊備註版珍藏巨量資料書籍。