Python編程:python-attrs模塊的簡單使用
1420
2022-05-30
1????? 介紹
當一個大表和小表進行join,大表的join列是分區列,小表的join列不是分區列時,Hive的動態分區剪裁就會收集小表的join列的集合,發送給tez am, am在為大表計算split時,會根據集合的值過濾大表不需要掃描的分區,從而減少數據掃描量,提高sql執行性能。
2????? 使用
針對hive 3.1.0版本,有如下參數與動態分區剪裁有關
參數名
默認值
描述
hive.tez.dynamic.partition.pruning
true
是否開啟動態分區剪裁
hive.tez.dynamic.partition.pruning.extended
true
hive.tez.dynamic.partition.pruning.max.event.size
1*1024*1024L
AppMasterEventOperator在運行時發送給AM的數量最大值。單位字節。
hive.tez.dynamic.partition.pruning.max.data.size
100*1024*1024L
Hive在編譯過程中估計的AppMasterEventOperator處理數據量最大值。單位字節。
對于TPC-DS query6, 開啟動態分區剪裁后,query6的執行時間由115s降到了58s ,性能提升1.98倍。
3????? 原理
3.1????? 邏輯優化
3.1.1??????? Join謂詞合成
動態分區剪裁在邏輯優化的PredicatePushDown規則前增加了SyntheticJoinPredicate規則,該規則會為每個join的父節點生成一個合成的條件。
如上圖,SynthicJoinPredicate會為每個join operator生成兩個父Filter Operator, Filter的謂詞條件為a in (select b from other table)。
為了能夠表達動態列表的表達式,Hive中引入了ExprNodeDynamicListDesc類,該類有三個參數:數據類型、數據源Operator,數據源的列表達式。
對于inner join,在join的所有父節點都會生成謂詞,對于left join和right join,只會在右和左側的父節點生成謂詞。
3.1.2??????? 謂詞下推
在這一步會借助已有的PredicatePushDown邏輯將謂詞條件盡可能的下推到TableScanOperator。
3.2????? 物理優化
3.2.1??????? 動態分區裁剪優化(DynamicPartitionPruningOptimization)
在遍歷Operator樹時,當遇到了符合條件的FilterOperator會執行動態分區剪裁優化。條件為: FilterOperator的父節點為TableScanOperator。否則將會把FilterOperator生成的合成謂詞替換為常量謂詞TRUE。
遇到符合條件的FilterOperator,動態分區剪裁優化會執行以下操作:
1.???? 收集謂詞中所有的動態分區條件的列(a in select b from other table),遍歷所有的列并執行2、3。
2.???? 如果列是分區列,那么生成AppMasterEventOperator,從ReduceSinkOperator的節點開始,收集相關列的集合并將其發送給AppMaster。
3.???? 將Filter中動態分區謂詞條件設置為TRUE
4.???? 將TableScanOperator動態分區謂詞條件設置為TRUE。
隨后的優化中會移除謂詞為TRUE的filter和表達式。
3.2.2??????? 依據統計量移除動態裁剪
這個優化會先遍歷整個Operator樹,找到AppMasterEventOperator,如果AppMasterEventOperator的統計數據大于hive.tez.dynamic.partition.pruning.max.data.size參數指定的大小,就會將本分支移除。
3.2.3??????? 動態裁剪循環分析優化
該優化借助Tarjan算法計算圖的所有強連通分量。在連通分量中保留處理數據量最小的AppMasterEventOperator.
3.3????? Tez 生成task
在這一步,處理所有的AppMasterEventOperator,設置AppMasterEventDesc的目標頂點信息。在運行時,AppMasterEventOperator會將數據發送給設置的頂點。
4????? Tez運行時分區剪裁
4.1????? AppMasterEventOperator運行時發送分區數據
AppMasterEventOperator在運行時,將會把所有的數據存儲到一個buffer中,如果發現數據大小超過了hive.tez.dynamic.partition.pruning.max.event.size指定的大小,那么會重新初始化buffer,只寫入兩個字段:列名和跳過分區,否則通過ProcessorContext將事件發送給AppMaster。
4.2????? HiveSplitGenerator
HiveSplitGenerator用于Tez生成split,其在初始化時會等待事件輸入(AppMasterEventOperator發送的事件),如果沒有事件會直接跳過動態分區剪裁,如果存在事件,那么會等待所有的事件接收完畢,執行分區剪裁。生成的split中會去除不需要的分區。
5????? 參考文檔
1.???? https://issues.apache.org/jira/browse/HIVE-7826
2.???? https://cwiki.apache.org/confluence/display/Hive/MapJoin+and+Partition+Pruning
大數據
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。