自適應查詢執行

自適應查詢執行(AQE)是發生在查詢執行查詢重新優化。

運行時重新優化的動機是磚最新的準確的統計數據的洗牌和廣播交換(稱為AQE查詢階段)。因此,磚可以選擇更好的物理策略,選擇最優post-shuffle分區大小和數目,或做優化,用於需要提示,例如,斜加入處理。

時,這可能是非常有用的統計信息收集統計時不打開或失效。也有用在靜態導出統計數據是不準確的地方,例如在一個複雜的查詢,或者發生後的數據傾斜。

功能

在磚運行時7.3 LTS以上,AQE默認情況下是啟用的。它有4個主要特點:

  • 排序合並連接到廣播哈希連接動態變化。

  • 動態合並分區(結合小分區合理大小的分區)洗牌後交流。非常小的任務更糟糕的I / O吞吐量和更容易遭受來自調度開銷和任務設置開銷。結合小任務節約資源和提高集群的吞吐量。

  • 動態處理斜排序合並連接和洗牌哈希連接的分裂和複製(如果需要)傾斜任務為大致均勻大小的任務。

  • 動態檢測和傳播空的關係。

應用程序

AQE適用於所有查詢:

  • 的非

  • 包含至少一個交易所(通常當有一個連接、聚集或窗口),子查詢,或兩者兼而有之。

並不是所有AQE-applied必然是優化查詢。重新優化可能或不可能想出一個比一個靜態編譯不同的查詢計劃。確定查詢的計劃已經改變了AQE,看到下麵的部分,查詢計劃

查詢計劃

本節討論如何以不同的方式查看查詢計劃。

火花UI

AdaptiveSparkPlan節點

包含一個或多個AQE-applied查詢AdaptiveSparkPlan節點,通常每個主查詢的根節點或子查詢。在查詢運行之前或者當它運行時,isFinalPlan相應的旗AdaptiveSparkPlan節點顯示為;在查詢執行完成後,isFinalPlan標誌的變化真實的。

發展計劃

查詢執行進度計劃圖的演變,反映了最新的計劃正在執行的。節點已經被執行(指標)不會改變,但是那些沒有可以改變隨著時間的推移重新優化的結果。

下麵是一個查詢計劃圖的例子:

查詢計劃圖

DataFrame.explain ()

AdaptiveSparkPlan節點

包含一個或多個AQE-applied查詢AdaptiveSparkPlan節點,通常每個主查詢的根節點或子查詢。在查詢運行之前或者當它運行時,isFinalPlan相應的旗AdaptiveSparkPlan節點顯示為;在查詢執行完成後,isFinalPlan標誌的變化真正的

當前和初步計劃

在每個AdaptiveSparkPlan節點會有最初的計劃(該計劃在應用任何AQE優化)和當前或最後的計劃,取決於執行完成。當前的計劃執行進度會進化。

運行時統計數據

每個洗牌和廣播階段包含統計數據。

前階段運行或運行階段時,統計數據是編譯時估計,國旗isRuntime,例如:統計(sizeInBytes = 1024.0簡約,rowCount = 4,isRuntime = false);

執行階段完成後,在運行時統計數據是收集和旗幟isRuntime將成為真正的,例如:統計(sizeInBytes = 658.1簡約,rowCount = 2.81 e + 4,isRuntime = true)

下麵是一個DataFrame.explain例子:

  • 在執行之前

    在執行之前
  • 執行期間

    在執行期間
  • 後執行

    後執行

SQL解釋

AdaptiveSparkPlan節點

通常包含一個或多個AdaptiveSparkPlan AQE-applied查詢節點,每個主查詢的根節點或子查詢。

目前沒有計劃

作為SQL解釋不執行查詢,目前的計劃總是一樣的最初計劃,並不能反映最終被AQE執行。

下麵是一個SQL解釋的例子:

SQL解釋

有效性

查詢計劃將會改變,如果一個或多個AQE優化生效。這些AQE優化的效果之間的差異,證明了電流和最終的計劃和初始計劃和具體計劃在當前節點和最終的計劃。

  • 動態改變排序合並連接到廣播哈希連接:不同的物理連接節點之間的電流/最終計劃和最初的計劃

    加入戰略字符串
  • 動態合並分區:節點CustomShuffleReader有財產合並

    自定義洗牌讀者
    自定義洗牌讀者字符串
  • 動態處理斜加入:節點SortMergeJoin與字段isSkew是真實的。

    傾斜連接計劃
    傾斜連接字符串
  • 動態檢測和傳播空關係:部分(或全部)的計劃取而代之的是節點LocalTableScan關係字段為空。

    當地表掃描
    當地表掃描字符串

配置

啟用和禁用自適應查詢執行

財產

spark.databricks.optimizer.adaptive.enabled

類型:布爾

是否啟用或禁用自適應查詢執行。

默認值:真正的

啟用自動最優化洗牌

財產

spark.sql.shuffle.partitions

類型:整數

洗牌時的默認分區數量使用連接或聚合數據。設置的值汽車啟用了自動最優化洗牌,自動確定這個數字根據查詢計劃和查詢輸入數據的大小。

注意:對於結構化流,這之間的配置不能改變查詢從相同的檢查點位置重新啟動。

默認值:200

動態改變排序合並連接到廣播哈希連接

財產

spark.databricks.adaptive.autoBroadcastJoinThreshold

類型:字節字符串

閾值觸發切換到廣播在運行時加入。

默認值:30 mb

動態合並分區

財產

spark.sql.adaptive.coalescePartitions.enabled

類型:布爾

是否啟用或禁用分區合並。

默認值:真正的

spark.sql.adaptive.advisoryPartitionSizeInBytes

類型:字節字符串

合並後的目標尺寸。合並分區大小將接近但不超過這一目標的大小。

默認值:64 mb

spark.sql.adaptive.coalescePartitions.minPartitionSize

類型:字節字符串

合並後分區的最小大小。合並分區大小不會比這個尺寸小。

默認值:1 mb

spark.sql.adaptive.coalescePartitions.minPartitionNum

類型:整數

合並後的最小數量的分區。不推薦,因為設置顯式重寫spark.sql.adaptive.coalescePartitions.minPartitionSize

默認值:2 x。集群的核心

動態處理斜加入

財產

spark.sql.adaptive.skewJoin.enabled

類型:布爾

是否啟用或禁用斜加入處理。

默認值:真正的

spark.sql.adaptive.skewJoin.skewedPartitionFactor

類型:整數

一個因素,當乘以平均分區大小有助於確定一個分區是否傾斜。

默認值:5

spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes

類型:字節字符串

一個閾值,有助於確定一個分區是否傾斜。

默認值:256 mb

一個分區是當兩個傾斜(分區大小>skewedPartitionFactor*中位數分區大小)(分區大小>skewedPartitionThresholdInBytes)真正的

動態檢測和空的傳播關係

財產

spark.databricks.adaptive.emptyRelationPropagation.enabled

類型:布爾

是否啟用或禁用動態空關係傳播。

默認值:真正的

常見問題(FAQ)

為什麼不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)

此外,斜處理支持某些連接類型是有限的,例如,在加入,隻有斜左側可以優化。

遺產

執行“適應性”這個詞已經存在自1.6火花,但新AQE引發3.0是完全不同的。在功能方麵,火花1.6隻有“動態合並分區”部分。在技術架構方麵,新AQE框架的動態規劃和重新規劃的查詢基於運行時統計數據,支持多種優化等我們在本文中所描述的和可以擴展,使更多的潛在優化。