Spark 3.x 中的自適應查詢執行(Adaptive Query Execution,簡稱 AQE)通過多種方式提升性能,主要包括以下幾個方面:
-
動態合并 Shuffle 分區(Coalescing Post Shuffle Partitions):
- 當 Shuffle 操作完成后,AQE 可以根據 Map 輸出的統計信息自動合并過小的分區,以減少 Reduce 階段的分區數量,從而提高查詢效率。這個特性通過配置?
spark.sql.adaptive.coalescePartitions.enabled
?開啟,默認在 Spark 3.2.0 及以后的版本中是啟用的
- 當 Shuffle 操作完成后,AQE 可以根據 Map 輸出的統計信息自動合并過小的分區,以減少 Reduce 階段的分區數量,從而提高查詢效率。這個特性通過配置?
-
動態切換 Join 策略:
- 在 Spark 2.x 中,broadcast-hash join 只能通過參數控制,不易精確控制。Spark 3.x 的 AQE 能夠根據運行時的統計信息自動將 sort-merge join 切換到 broadcast-hash join,優化性能。
-
動態優化數據傾斜的 Join:
- 在 Spark 2.x 中,需要手動處理數據傾斜問題。Spark 3.x 的 AQE 可以自動將傾斜的分區分成更小的分區進行 join,極大優化性能。
-
動態裁剪分區(Dynamic Partition Pruning):
- 在 Spark 2.x 中,優化器很難在編譯時確定哪些分區可以跳過不讀,導致讀了一些不需要的數據。Spark 3.x 的 AQE 會首先過濾維表,根據過濾后的結果找到只需要讀事實表的哪些分區,提升性能。
-
自動處理數據傾斜:
- AQE 自動檢測并處理數據傾斜,通過將大型傾斜分區拆分為更小的分區,確保工作負載平衡,提高性能。
-
動態優化洗牌分區:
- AQE 根據實際數據的大小動態調整洗牌分區的數量,優化并行性和開銷之間的平衡,增強資源管理,減少內存使用和執行時間。
-
減少手動調優需求:
- 傳統的查詢執行通常需要手動調優以實現最佳性能。AQE 自動化了許多這一過程,減少了手動干預的需求,使得開箱即用即可獲得良好性能。
通過這些機制,AQE 在運行時動態優化執行計劃,根據實時數據特征調整,從而提升查詢性能,減少資源消耗,并減少手動調優的需求。這些改進使得 Spark 3.x 在處理大型或傾斜數據集時,相較于 Spark 2.x,性能有了顯著提升。