Hive 動態分區剪裁原理

      網友投稿 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。

      Hive 動態分區剪裁原理

      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小時內刪除侵權內容。

      上一篇:「免費開源」基于Vue和Quasar的crudapi前端SPA項目實戰之文件上傳(十)
      下一篇:VSCode使用技巧
      相關文章
      久久噜噜噜久久亚洲va久| 亚洲av永久无码精品秋霞电影影院 | 亚洲日韩一区精品射精| 亚洲另类激情综合偷自拍图| 亚洲人成网站色在线入口| 精品无码专区亚洲| 亚洲aⅴ无码专区在线观看春色| 亚洲精品国产精品国自产网站| 亚洲国产精品线观看不卡| 亚洲精品资源在线| 亚洲精品亚洲人成在线麻豆| 亚洲色大成网站www永久| 911精品国产亚洲日本美国韩国 | 亚洲精品无码久久久久秋霞 | 亚洲精品无码国产| 久久九九亚洲精品| 亚洲av激情无码专区在线播放| 亚洲AV日韩AV永久无码绿巨人 | 久久精品国产亚洲av天美18| 亚洲av无码一区二区三区天堂| 亚洲GV天堂无码男同在线观看| 亚洲av无码专区在线电影天堂| 亚洲av日韩av永久无码电影| 激情无码亚洲一区二区三区 | 亚洲国产精品狼友中文久久久| 亚洲日韩中文字幕日韩在线| 自拍偷自拍亚洲精品被多人伦好爽| 狠狠亚洲婷婷综合色香五月排名| 亚洲一区二区女搞男| 亚洲国产成人一区二区三区| 亚洲欧洲日韩不卡| 亚洲性无码av在线| 亚洲熟妇无码av另类vr影视| 亚洲国产AV无码一区二区三区| 处破女第一次亚洲18分钟| 亚洲一区二区三区免费| 久久久青草青青亚洲国产免观| 亚洲国产精品自在线一区二区| 亚洲成人高清在线观看| 亚洲一卡2卡3卡4卡5卡6卡| 色天使亚洲综合一区二区|