自適應查詢執行
自適應查詢執行(AQE)是發生在查詢執行查詢重新優化。
運行時重新優化的動機是磚最新的準確的統計數據的洗牌和廣播交換(稱為AQE查詢階段)。因此,磚可以選擇更好的物理策略,選擇最優post-shuffle分區大小和數目,或做優化,用於需要提示,例如,斜加入處理。
時,這可能是非常有用的統計信息收集統計時不打開或失效。也有用在靜態導出統計數據是不準確的地方,例如在一個複雜的查詢,或者發生後的數據傾斜。
功能
在磚運行時7.3 LTS以上,AQE默認情況下是啟用的。它有4個主要特點:
排序合並連接到廣播哈希連接動態變化。
動態合並分區(結合小分區合理大小的分區)洗牌後交流。非常小的任務更糟糕的I / O吞吐量和更容易遭受來自調度開銷和任務設置開銷。結合小任務節約資源和提高集群的吞吐量。
動態處理斜排序合並連接和洗牌哈希連接的分裂和複製(如果需要)傾斜任務為大致均勻大小的任務。
動態檢測和傳播空的關係。
應用程序
AQE適用於所有查詢:
的非
包含至少一個交易所(通常當有一個連接、聚集或窗口),子查詢,或兩者兼而有之。
並不是所有AQE-applied必然是優化查詢。重新優化可能或不可能想出一個比一個靜態編譯不同的查詢計劃。確定查詢的計劃已經改變了AQE,看到下麵的部分,查詢計劃。
查詢計劃
本節討論如何以不同的方式查看查詢計劃。
在本節中:
火花UI
DataFrame.explain ()
有效性
查詢計劃將會改變,如果一個或多個AQE優化生效。這些AQE優化的效果之間的差異,證明了電流和最終的計劃和初始計劃和具體計劃在當前節點和最終的計劃。
動態改變排序合並連接到廣播哈希連接:不同的物理連接節點之間的電流/最終計劃和最初的計劃
動態合並分區:節點
CustomShuffleReader
有財產合並
動態處理斜加入:節點
SortMergeJoin
與字段isSkew
是真實的。動態檢測和傳播空關係:部分(或全部)的計劃取而代之的是節點LocalTableScan關係字段為空。
配置
啟用和禁用自適應查詢執行
財產 |
---|
spark.databricks.optimizer.adaptive.enabled 類型: 是否啟用或禁用自適應查詢執行。 默認值: |
動態改變排序合並連接到廣播哈希連接
財產 |
---|
spark.databricks.adaptive.autoBroadcastJoinThreshold 類型: 閾值觸發切換到廣播在運行時加入。 默認值: |
動態合並分區
財產 |
---|
spark.sql.adaptive.coalescePartitions.enabled 類型: 是否啟用或禁用分區合並。 默認值: |
spark.sql.adaptive.advisoryPartitionSizeInBytes 類型: 合並後的目標尺寸。合並分區大小將接近但不超過這一目標的大小。 默認值: |
spark.sql.adaptive.coalescePartitions.minPartitionSize 類型: 合並後分區的最小大小。合並分區大小不會比這個尺寸小。 默認值: |
spark.sql.adaptive.coalescePartitions.minPartitionNum 類型: 合並後的最小數量的分區。不推薦,因為設置顯式重寫 默認值:2 x。集群的核心 |
動態處理斜加入
財產 |
---|
spark.sql.adaptive.skewJoin.enabled 類型: 是否啟用或禁用斜加入處理。 默認值: |
spark.sql.adaptive.skewJoin.skewedPartitionFactor 類型: 一個因素,當乘以平均分區大小有助於確定一個分區是否傾斜。 默認值: |
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes 類型: 一個閾值,有助於確定一個分區是否傾斜。 默認值: |
一個分區是當兩個傾斜(分區大小>skewedPartitionFactor*中位數分區大小)
和(分區大小>skewedPartitionThresholdInBytes)
是真正的
。
動態檢測和空的傳播關係
財產 |
---|
spark.databricks.adaptive.emptyRelationPropagation.enabled 類型: 是否啟用或禁用動態空關係傳播。 默認值: |
常見問題(FAQ)
在本節中:
AQE為什麼不改變洗牌分區號盡管分區合並已經啟用了嗎?
AQE不會改變最初的分區號。建議您設置一個合理的高價值的洗牌分區號,讓AQE合並小分區基於查詢的輸出數據的大小在每個階段。
如果你看到灑在你的工作,你可以試試:
增加了洗牌分區號配置:
spark.sql.shuffle.partitions
啟用自動洗牌通過設置進行了優化
spark.databricks.adaptive.autoOptimizeShuffle.enabled
來真正的
為什麼不AQE廣播一個連接表?
如果將廣播的大小關係是否屬於這個閾值但還沒有廣播:
檢查連接類型。播放不支持特定的連接類型,例如,左邊的關係
左外加入
不能播放。它也可以包含很多空分區的關係,在這種情況下,能夠迅速完成大多數任務的排序合並連接或與斜加入可以優化處理。AQE避免改變這樣的排序合並連接廣播散列連接的比例低於非空分區
spark.sql.adaptive.nonEmptyPartitionRatioForBroadcastJoin
。
我還是應該使用廣播提示啟用了AQE加入策略嗎?
是的。靜態計劃廣播加入通常比動態規劃一個更好的性能由AQE AQE才會切換到廣播加入執行洗牌後雙方的加入(的時間)獲得的實際大小的關係。所以使用廣播提示仍然可以是一個不錯的選擇如果你知道你的查詢。AQE會尊重查詢提示一樣的靜態優化,但是仍然可以應用動態優化不受暗示的影響。
之間的區別是什麼斜加入提示和AQE傾斜連接優化嗎?我應該使用哪一個?
建議依靠AQE傾斜連接處理,而不是使用傾斜連接提示,因為AQE傾斜連接是完全自動的,一般執行比提示。
AQE調整我為什麼不加入自動訂購嗎?
的動態加入重新排序不屬於AQE磚LTS 7.3運行時。
為什麼不AQE檢測我的數據傾斜?
有兩個尺寸必須滿足條件AQE檢測一個分區作為一個傾斜的分區:
分區大小大於
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes
(默認256 mb)中等大小的分區大小大於所有分區倍傾斜分區的因素
spark.sql.adaptive.skewJoin.skewedPartitionFactor
(默認5)
此外,斜處理支持某些連接類型是有限的,例如,在左外加入
,隻有斜左側可以優化。