更新時間:2022-08-31 來源:黑馬程序員 瀏覽量:
由于缺乏或者不準確的數(shù)據(jù)統(tǒng)計信息(元數(shù)據(jù))和對成本的錯誤估算(執(zhí)行計劃調度)導致生成的初始執(zhí)行計劃不理想在Spark3.x版本提供Adaptive Query Execution自適應查詢技術通過在”運行時”對查詢執(zhí)行計劃進行優(yōu)化, 允許Planner在運行時執(zhí)行可選計劃,這些可選計劃將會基于運行時數(shù)據(jù)統(tǒng)計進行動態(tài)優(yōu)化, 從而提高性能。
Adaptive Query Execution AQE主要提供了三個自適應優(yōu)化:
? 動態(tài)合并 Shuffle Partitions
? 動態(tài)調整Join策略
? 動態(tài)優(yōu)化傾斜Join(Skew Joins)
可以動態(tài)調整shuffle分區(qū)的數(shù)量。用戶可以在開始時設置相對較多的shuffle分區(qū)數(shù),AQE會在運行時將相鄰的小分區(qū)合并為較大的分區(qū)。
此優(yōu)化可以在一定程度上避免由于缺少統(tǒng)計信息或著錯誤估計大小(當然也可能兩種情況同時存在),而導致執(zhí)行計劃性能不佳的情況。這種自適應優(yōu)化可以在運行時sort merge join轉換成broadcast hash join,從而進一步提升性能。
skew joins可能導致負載的極端不平衡,并嚴重降低性能。在AQE從shuffle文件統(tǒng)計信息中檢測到任何傾斜后,它可以將傾斜的分區(qū)分割成更小的分區(qū),并將它們與另一側的相應分區(qū)連接起來。這種優(yōu)化可以并行化傾斜處理,獲得更好的整體性能。
觸發(fā)條件:
分區(qū)大小 > spark.sql.adaptive.skewJoin.skewedPartitionFactor (default=10) * "median partition size(中位數(shù)分區(qū)大小)"
分區(qū)大小 > spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes (default = 256MB)
總結:
(1) AQE的開啟通過: spark.sql.adaptive.enabled 設置為true開啟。
(2) AQE是自動化優(yōu)化機制, 無需我們設置復雜的參數(shù)調整, 開啟AQE符合條件即可自動化應用AQE優(yōu)化。
(3) AQE帶來了極大的SparkSQL性能提升。