Spark-SQL adaptive 自適應框架

一、自適應框架能解決什麼問題
1、目前SparkSQL中reduce階段的task個數取決於固定參數spark.sql.shuffle.partition(默認值200),一個作業一旦設置了該參數,它運行過程中的所有階段的reduce個數都是同一個值。
而對於不同的作業,以及同一個作業內的不同reduce階段,實際的數據量大小可能相差很大,比如reduce階段要處理的數據可能是10MB,也有可能是100GB, 如果使用同一個值對實際運行效率會產生很大影響,比如10MB的數據一個task就可以解決,如果spark.sql.shuffle.partition使用默認值200的話,那麼10MB的數據就要被分成200個task處理,增加了調度開銷,影響運行效率。
SparkSQL自適應框架可以通過設置shuffle partition的上下限區間,在這個區間內對不同作業不同階段的reduce個數進行動態調整。
通過區間的設置,一方面可以大大減少調優的成本(不需要找到一個固定值),另一方面同一個作業內部不同reduce階段的reduce個數也能動態調整
參數如下:

spark.sql.adaptive.enabled     默認false  自適應執行框架的開關
spark.sql.adaptive.minNumPostShufflePartitions               默認爲1     reduce個數區間最小值
spark.sql.adaptive.maxNumPostShufflePartitions   默認爲500     reduce個數區間最大值
spark.sql.adaptive.shuffle.targetPostShuffleInputSize  默認爲67108864     動態調整reduce個數的partition大小依據,如設置64MB則reduce階段每個task最少處理64MB的數據
spark.sql.adaptive.shuffle.targetPostShuffleRowCount 默認爲20000000 動態調整reduce個數的partition條數依據,如設置20000000則reduce階段每個task最少處理20000000條的數據

2、數據傾斜
join中會經常碰到數據傾斜的場景,導致某些task處理的數據過多,出現很嚴重的長尾。目前SparkSQL沒有對傾斜的數據進行相關的優化處理。
SparkSQL自適應框架可以根據預先的配置在作業運行過程中自動檢測是否出現傾斜,並對檢測到的傾斜進行優化處理。
優化的主要邏輯是對傾斜的partition進行拆分由多個task來進行處理,最後通過union進行結果合併。

join類型                     備註
Inner               左/右表均可處理傾斜
Cross               左/右表均可處理傾斜
LeftSemi            只對左表處理傾斜
LeftAnti            只對左表處理傾斜
LeftOuter           只對左表處理傾斜
RightOuter          只對右表處理傾斜
spark.sql.adaptive.enabled 默認爲false 自適應執行框架的開關
spark.sql.adaptive.skewedJoin.enabled 默認爲 false  傾斜處理開關
spark.sql.adaptive.skewedPartitionFactor 默認爲10 當一個partition的size大小 大於 該值乘以所有parititon大小的中位數 且 大於spark.sql.adaptive.skewedPartitionSizeThreshold,或者parition的條數大於該值乘以所有parititon條數的中位數且 大於 spark.sql.adaptive.skewedPartitionRowCountThreshold, 纔會被當做傾斜的partition進行相應的處理
spark.sql.adaptive.skewedPartitionSizeThreshold 默認爲67108864 傾斜的partition大小不能小於該值,該值還需要參照HDFS使用的壓縮算法以及存儲文件類型(如ORC、Parquet等)
spark.sql.adaptive.skewedPartitionRowCountThreshold  默認爲10000000 傾斜的partition條數不能小於該值
spark.shuffle.statistics.verbose 默認爲false 打開後MapStatus會採集每個partition條數的信息,用於傾斜處理

3、Runtime執行計劃優化
SparkSQL的Catalyst優化器會將sql語句轉換成物理執行計劃,然後真正運行物理執行計劃。但是Catalyst轉換物理執行計劃的過程中,由於缺少Statistics統計信息,或者Statistics統計信息不準等原因,會到時轉換的物理執行計劃可能並不是最優的,比如轉換爲SortMergeJoinExec,但實際BroadcastJoin更合適。
SparkSQL自適應執行框架會在物理執行計劃真正運行的過程中,動態的根據shuffle階段shuffle write的實際數據大小,來調整是否可以用BroadcastJoin來代替SortMergeJoin,提高運行效率。
spark.sql.adaptive.enabled 默認爲false 自適應執行框架的開關
spark.sql.adaptive.join.enabled 默認true 開關
spark.sql.adaptiveBroadcastJoinThreshold 默認等於spark.sql.autoBroadcastJoinThreshold 運行過程中用於判斷是否滿足BroadcastJoin條件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章