概述
Hive的執(zhí)行計(jì)劃描述了一個(gè)hiveSQL語句的具體執(zhí)行步驟,通過執(zhí)行計(jì)劃解讀可以了解hiveSQL語句被解析器轉(zhuǎn)換為相應(yīng)程序語言的執(zhí)行邏輯。通過執(zhí)行邏輯可以知曉HiveSQL運(yùn)行流程,進(jìn)而對(duì)流程進(jìn)行優(yōu)化,實(shí)現(xiàn)更優(yōu)的數(shù)據(jù)查詢處理。
同樣,通過執(zhí)行計(jì)劃,還可以了解到哪些不一樣的SQL邏輯其實(shí)是等價(jià)的,哪些看似一樣的邏輯其實(shí)是執(zhí)行代價(jià)完全不一樣。
如果說Hive優(yōu)化是一堵技術(shù)路上的高墻,那么關(guān)于Hive執(zhí)行計(jì)劃,就是爬上這堵高墻的一架梯子。
不同版本的Hive會(huì)采用不同的方式生成的執(zhí)行計(jì)劃。主要區(qū)別就是基于規(guī)則生成hive執(zhí)行計(jì)劃,和基于成本代價(jià)來生成執(zhí)行計(jì)劃。而hive早期版本是基于規(guī)則生成執(zhí)行計(jì)劃,在Hive0.14及之后的版本都是基于成本代價(jià)來生成執(zhí)行計(jì)劃,這主要是集成了Apache Calcite。Apache Calcite具體可以查看官網(wǎng)介紹。
兩種方式的優(yōu)劣顯而易見,基于規(guī)則生成執(zhí)行計(jì)劃,作為使用方來說,集群的環(huán)境,數(shù)據(jù)量的大小完全不一樣,同樣的規(guī)則邏輯,執(zhí)行起來差異巨大,因此會(huì)對(duì)開發(fā)者有更高的優(yōu)化要求。Hive基于成本代價(jià)來生成執(zhí)行計(jì)劃,這種方式能夠結(jié)合Hive元數(shù)據(jù)信息和Hive運(yùn)行過程收集到的各類存儲(chǔ)統(tǒng)計(jì)信息推測(cè)出一個(gè)更合理的執(zhí)行計(jì)劃。也就是說Hive本身已經(jīng)為我們的SQL語句做了一輪優(yōu)化了,可以預(yù)見的將來,Hive還會(huì)具備更多的優(yōu)化能力。
Hive執(zhí)行計(jì)劃是一個(gè)預(yù)估的執(zhí)行計(jì)劃,只有在SQL實(shí)際執(zhí)行后才會(huì)獲取到真正的執(zhí)行計(jì)劃,而一些關(guān)系型數(shù)據(jù)庫中,會(huì)提供真實(shí)的SQL執(zhí)行計(jì)劃。如SQLserver和Oracle等。
1.hive執(zhí)行計(jì)劃的查看
Hive提供的執(zhí)行計(jì)劃使用語法如下:
EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query
- EXPLAIN:查看執(zhí)行計(jì)劃的基本信息;
- EXTENDED:加上 extended 可以輸出有關(guān)計(jì)劃的額外擴(kuò)展信息。這些通常是物理信息,例如文件名等;
- CBO:可以選擇使用Calcite優(yōu)化器不同成本模型生成計(jì)劃。CBO 從 hive 4.0.0 版本開始支持;
- AST:輸出查詢的抽象語法樹。AST 在hive 2.1.0 版本刪除了,存在bug,轉(zhuǎn)儲(chǔ)AST可能會(huì)導(dǎo)致OOM錯(cuò)誤,將在4.0.0版本修復(fù);
- DEPENDENCY:dependency在EXPLAIN語句中使用會(huì)產(chǎn)生有關(guān)計(jì)劃中輸入的依賴信息。包含表和分區(qū)信息等;
- AUTHORIZATION:顯示SQL操作相關(guān)權(quán)限的信息;
- LOCKS:這對(duì)于了解系統(tǒng)將獲得哪些鎖以運(yùn)行指定的查詢很有用。LOCKS 從 hive 3.2.0 開始支持;
- VECTORIZATION:查看SQL的矢量化描述信息;
- ANALYZE:用實(shí)際的行數(shù)注釋計(jì)劃。從 Hive 2.2.0 開始支持;
以上內(nèi)容重點(diǎn)關(guān)注explain,explain extend,explain dependency,explain authorization,explain vectorization。
2.學(xué)會(huì)查看Hive執(zhí)行計(jì)劃的基本信息
一個(gè)HIVE查詢被轉(zhuǎn)換為一個(gè)由一個(gè)或多個(gè)stage組成的序列(有向無環(huán)圖DAG)。這些stage可以是MapReduce stage,也可以是負(fù)責(zé)元數(shù)據(jù)存儲(chǔ)的stage,也可以是負(fù)責(zé)文件系統(tǒng)的操作(比如移動(dòng)和重命名)的stage。
在查詢SQL語句前加上關(guān)鍵字explain用來查看執(zhí)行計(jì)劃的基本信息。
可以看如下實(shí)例的執(zhí)行計(jì)劃結(jié)果解析:
實(shí)例SQL
-- 本文默認(rèn)使用mr計(jì)算引擎
explain
-- 統(tǒng)計(jì)年齡小于30歲各個(gè)年齡里,昵稱里帶“小”的人數(shù)
select age,count(0) as num from temp.user_info_all where ymd = '20230505'
and age < 30 and nick like '%小%'
group by age;
執(zhí)行計(jì)劃:
# 描述任務(wù)之間stage的依賴關(guān)系
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1
# 每個(gè)stage詳細(xì)信息
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
我們將上述結(jié)果拆分看,先從最外層開始,包含兩個(gè)大的部分:
-
stage dependencies: 各個(gè)stage之間的依賴性
-
stage plan: 各個(gè)stage的執(zhí)行計(jì)劃
先看第一部分 stage dependencies ,包含兩個(gè) stage,Stage-1 是根stage,說明這是開始的stage,Stage-0 依賴 Stage-1,Stage-1執(zhí)行完成后執(zhí)行Stage-0。
一些Hive執(zhí)行邏輯的可視化工具頁面就是利用該語句信息繪畫出Hive執(zhí)行流程圖以及相關(guān)進(jìn)度信息。
再看第二部分 stage plan,里面有一個(gè) Map Reduce,一個(gè)MR的執(zhí)行計(jì)劃分為兩個(gè)部分:
- Map Operator Tree: MAP端的執(zhí)行計(jì)劃樹
- Reduce Operator Tree: Reduce端的執(zhí)行計(jì)劃樹
這兩個(gè)執(zhí)行計(jì)劃樹里面包含這條sql語句的 operator:
map端Map Operator Tree信息解讀:
-
TableScan 對(duì)關(guān)鍵字alias聲明的結(jié)果集進(jìn)行表掃描操作。
alias: 表名稱
Statistics: 表統(tǒng)計(jì)信息,包含表中數(shù)據(jù)條數(shù),數(shù)據(jù)大小等
-
Filter Operator:過濾操作,表示在之前的表掃描結(jié)果集上進(jìn)行數(shù)據(jù)過濾。
predicate:過濾數(shù)據(jù)時(shí)使用的謂詞(過濾條件),如sql語句中的and age < 30,則此處顯示(age < 30),什么是謂詞,以及優(yōu)化點(diǎn),可以詳細(xì)看之前一篇文章謂詞下推。
Statistics:過濾后數(shù)據(jù)條數(shù)和大小。
-
Select Operator: 對(duì)列進(jìn)行投影,即篩選列,選取操作。
expressions:篩選的列名稱及列類型
outputColumnNames:輸出的列名稱
Statistics:篩選列后表統(tǒng)計(jì)信息,包含表中數(shù)據(jù)條數(shù),數(shù)據(jù)大小等。
-
Group By Operator:分組聚合操作。
aggregations:顯示聚合函數(shù)信息,這里使用
count(0)
。keys:表示分組的列,如果沒有分組,則沒有此字段。
mode:聚合模式,值有 hash:隨機(jī)聚合;mergepartial:合并部分聚合結(jié)果;final:最終聚合
outputColumnNames:聚合之后輸出列名,_col0對(duì)應(yīng)的是age列, _col1對(duì)應(yīng)的是count(0)列。
Statistics: 表統(tǒng)計(jì)信息,包含分組聚合之后的數(shù)據(jù)條數(shù),數(shù)據(jù)大小。
-
Reduce Output Operator:輸出到reduce操作結(jié)果集信息。
key expressions:MR計(jì)算引擎,在map和reduce階段的輸出都是key-value形式,這里描述的是map端輸出的鍵使用的是哪個(gè)數(shù)據(jù)列。_col0對(duì)應(yīng)的是age列。
sort order:值為空不排序;值為 + 正序排序,值為 - 倒序排序;值為 +- 排序的列為兩列,第一列為正序,第二列為倒序,以此類推多值排序。
Map-reduce partition columns:表示Map階段輸出到Reduce階段的分區(qū)列,在HiveSQL中,可以用distribute by指定分區(qū)的列。這里默認(rèn)為_col0對(duì)應(yīng)的是age列。
Statistics:輸出結(jié)果集的統(tǒng)計(jì)信息。
value expressions:對(duì)應(yīng)key expressions,這里是value值字段。_col1對(duì)應(yīng)的是count(0)列。
接下來是reduce階段Reduce Operator Tree,出現(xiàn)和map階段關(guān)鍵詞一樣的,其含義是一致的,羅列一下map階段未出現(xiàn)的關(guān)鍵詞。
-
File Output Operator:文件輸出操作。
compressed:表示輸出結(jié)果是否進(jìn)行壓縮,true壓縮,false不壓縮。
-
table:表示當(dāng)前操作表的信息。
input format:輸入文件類型。
output format:輸出文件類型。
serde:讀取表數(shù)據(jù)的序列化和反序列化方式。
Stage-0的操作信息。
-
Fetch Operator:客戶端獲取數(shù)據(jù)操作。
limit:值為-1標(biāo)識(shí)不限制條數(shù),其他值為限制的條數(shù)。
-
Processor Tree:處理器樹
ListSink:數(shù)據(jù)展示。
3.執(zhí)行計(jì)劃步驟操作過程
可以根據(jù)上述執(zhí)行計(jì)劃通過流程圖來描述一下hiveSQL的執(zhí)行邏輯過程。
通過上圖可以很清晰的了解一個(gè)hiveSQL的執(zhí)行邏輯過程,便于理解hive數(shù)據(jù)流轉(zhuǎn)過程。
4.explain extended
explain extended可以查看explain的擴(kuò)展信息,主要包含三個(gè)部分內(nèi)容:
- 抽象語法樹(Abstract Syntax Tree,AST):是SQL轉(zhuǎn)換成MR或其他計(jì)算引擎的任務(wù)中的一個(gè)重要過程。AST 在HIVE-13533中從 explain extended 中刪除 ,并在HIVE-15932 中恢復(fù)為單獨(dú)的命令 。
- 作業(yè)的依賴關(guān)系圖,同explain展現(xiàn)內(nèi)容。
- 每個(gè)作業(yè)的詳細(xì)信息,即Stage Plans,相比explain多了表配置信息,表文件存儲(chǔ)路徑等。具體可以通過以下命令進(jìn)行查看比對(duì)。不作列舉了。
explain extended
-- 統(tǒng)計(jì)年齡小于30歲各個(gè)年齡里,昵稱里帶“小”的人數(shù)
select age,count(0) as num from temp.user_info_all where ymd = '20230505'
and age < 30 and nick like '%小%'
group by age;
下一期:Hive執(zhí)行計(jì)劃之hive依賴及權(quán)限查詢和常見使用場(chǎng)景
按例,歡迎點(diǎn)擊此處關(guān)注我的個(gè)人公眾號(hào),交流更多知識(shí)。文章來源:http://www.zghlxwxcb.cn/news/detail-473551.html
后臺(tái)回復(fù)關(guān)鍵字 hive,隨機(jī)贈(zèng)送一本魯邊備注版珍藏大數(shù)據(jù)書籍。文章來源地址http://www.zghlxwxcb.cn/news/detail-473551.html
到了這里,關(guān)于Hive執(zhí)行計(jì)劃之一文讀懂Hive執(zhí)行計(jì)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!