概述
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等,
1.hive執行計劃的查看
Hive提供的執行計劃使用語法如下:
EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query
- EXPLAIN:查看執行計劃的基本資訊;
- EXTENDED:加上 extended 可以輸出有關計劃的額外擴展資訊,這些通常是物理資訊,例如檔案名等;
- CBO:可以選擇使用Calcite優化器不同成本模型生成計劃,CBO 從 hive 4.0.0 版本開始支持;
- AST:輸出查詢的抽象語法樹,AST 在hive 2.1.0 版本洗掉了,存在bug,轉儲AST可能會導致OOM錯誤,將在4.0.0版本修復;
- DEPENDENCY:dependency在EXPLAIN陳述句中使用會產生有關計劃中輸入的依賴資訊,包含表和磁區資訊等;
- AUTHORIZATION:顯示SQL操作相關權限的資訊;
- LOCKS:這對于了解系統將獲得哪些鎖以運行指定的查詢很有用,LOCKS 從 hive 3.2.0 開始支持;
- VECTORIZATION:查看SQL的矢量化描述資訊;
- ANALYZE:用實際的行數注釋計劃,從 Hive 2.2.0 開始支持;
以上內容重點關注explain,explain extend,explain dependency,explain authorization,explain vectorization,
2.學會查看Hive執行計劃的基本資訊
一個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的執行計劃分為兩個部分:
- Map Operator Tree: MAP端的執行計劃樹
- Reduce Operator Tree: Reduce端的執行計劃樹
這兩個執行計劃樹里面包含這條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:資料展示,
3.執行計劃步驟操作程序
可以根據上述執行計劃通過流程圖來描述一下hiveSQL的執行邏輯程序,
通過上圖可以很清晰的了解一個hiveSQL的執行邏輯程序,便于理解hive資料流轉程序,
4.explain extended
explain extended可以查看explain的擴展資訊,主要包含三個部分內容:
- 抽象語法樹(Abstract Syntax Tree,AST):是SQL轉換成MR或其他計算引擎的任務中的一個重要程序,AST 在HIVE-13533中從 explain extended 中洗掉 ,并在HIVE-15932 中恢復為單獨的命令 ,
- 作業的依賴關系圖,同explain展現內容,
- 每個作業的詳細資訊,即Stage Plans,相比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,隨機贈送一本魯邊備注版珍藏大資料書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554506.html
標籤:其他
上一篇:Zookeeper
下一篇:返回列表