阿里雲EMR-3.13.0版本的SparkSQL支持自適應執行功能。
解決哪些問題
SparkSQL自適應執行解決以下問題:
shuffle partition個數
目前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.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條的數據 |
數據傾斜
join中會經常碰到數據傾斜的場景,導致某些task處理的數據過多,出現很嚴重的長尾。目前SparkSQL沒有對傾斜的數據進行相關的優化處理。
SparkSQL自適應框架可以根據預先的配置在作業運行過程中自動檢測是否出現傾斜,並對檢測到的傾斜進行優化處理。
優化的主要邏輯是對傾斜的partition進行拆分由多個task來進行處理,最後通過union進行結果合併。
支持的Join類型:
join類型 | 備註 |
---|---|
Inner | 左/右表均可處理傾斜 |
Cross | 左/右表均可處理傾斜 |
LeftSemi | 只對左表處理傾斜 |
LeftAnti | 只對左表處理傾斜 |
LeftOuter | 只對左表處理傾斜 |
RightOuter | 只對右表處理傾斜 |
參數:
屬性名稱 | 默認值 | 備註 |
---|---|---|
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大小不能小於該值 |
spark.sql.adaptive.skewedPartitionRowCountThreshold | 10000000 | 傾斜的partition條數不能小於該值 |
spark.shuffle.statistics.verbose | false | 打開後MapStatus會採集每個partition條數的信息,用於傾斜處理 |
Runtime執行計劃優化
SparkSQL的Catalyst優化器會將sql語句轉換成物理執行計劃,然後真正運行物理執行計劃。但是Catalyst轉換物理執行計劃的過程中,由於缺少Statistics統計信息,或者Statistics統計信息不準等原因,會到時轉換的物理執行計劃可能並不是最優的,比如轉換爲SortMergeJoinExec,但實際BroadcastJoin更合適。
SparkSQL自適應執行框架會在物理執行計劃真正運行的過程中,動態的根據shuffle階段shuffle write的實際數據大小,來調整是否可以用BroadcastJoin來代替SortMergeJoin,提高運行效率。
參數:
屬性名稱 | 默認值 | 備註 |
---|---|---|
spark.sql.adaptiveBroadcastJoinThreshold | 等於spark.sql.autoBroadcastJoinThreshold | 運行過程中用於判斷是否滿足BroadcastJoin條件 |