Managed Service for Apache Spark 自動調度資源功能可讓您動態調度工作負載資源 (例如執行器數量),有效率地執行 Spark 工作。自動調度資源功能預設為啟用,會使用 Spark 動態資源分配,判斷是否要調度工作負載資源,以及調度方式和時機。
Managed Service for Apache Spark 自動調度資源 V2
Managed Service for Apache Spark 自動調度資源第 2 版 (V2) 新增了功能,並對預設第 1 版 (V1) 進行改良,可協助您管理 Managed Service for Apache Spark 工作負載、提升工作負載效能及節省成本:
- 非同步節點縮減:Autoscaling V2 將 V1 的同步縮減作業替換為非同步縮減作業。Managed Service for Apache Spark 採用非同步縮減資源,不需等待所有節點完成重組遷移,即可縮減工作負載資源。這表示縮減速度緩慢的長尾節點不會阻礙向上擴充。
- 智慧型縮減節點選取:Autoscaling V2 取代 V1 的隨機節點選取,改用智慧型演算法,優先找出最適合縮減的節點。這項演算法會考量節點的重組資料大小和閒置時間等因素。
- 可設定 Spark 安全停用和重組遷移行為:Autoscaling V2 可讓您使用標準 Spark 屬性,設定 Spark 安全停用和重組遷移。這項功能可協助您維持遷移相容性,並自訂 Spark 屬性。
Managed Service for Apache Spark 自動調度資源功能
| 功能 | Managed Service for Apache Spark 自動調度資源 V1 | Managed Service for Apache Spark 自動調度資源 V2 |
| 縮減節點 | 同步 | 非同步 |
| 選取要縮減資源的節點 | 隨機 | 智慧技術 |
| Spark 安全停用和重組遷移 | 無法設定 | 可自行設定 |
Spark 動態分配屬性
下表列出提交批次工作負載時,可設定的 Spark 動態分配屬性,用於控制自動調度資源 (請參閱如何設定 Spark 屬性)。
| 屬性 | 說明 | 預設 |
|---|---|---|
spark.dataproc.scaling.version |
Managed Service for Apache Spark 自動調度資源版本。指定 1 或 2 版本。 |
1 |
spark.dynamicAllocation.enabled |
是否要使用動態資源分配機制,依據工作負載擴充及縮減執行器數量。
如果將值設為 false,系統會停用工作負載的自動調度資源功能。預設值:true。 |
true |
spark.dynamicAllocation.initialExecutors |
分配給工作負載的初始執行器數量。工作負載啟動後,自動調度資源功能可能會變更執行中的執行器數量。最小值為 2,最大值為 2000。 |
2 |
spark.dynamicAllocation.minExecutors |
工作負載縮減後的執行器數量下限。值不得小於 2。 |
2 |
spark.dynamicAllocation.maxExecutors |
工作負載可擴充至的執行器數量上限。最大值為 2000。 |
1000 |
spark.dynamicAllocation.executorAllocationRatio |
自訂 Spark 工作負載的擴充。接受的值介於 0 到 1 之間。1.0 值可提供最大規模的擴充能力,並有助於達到最大平行處理量。如果值為 0.5,則會將擴充功能和平行處理設為最大值的一半。 |
0.3 |
spark.dynamicAllocation.diagnosis.enabled |
如果 true,且執行中的執行器數量超過 spark.dynamicAllocation.diagnosis.interval 指定期間內所需的最大執行器數量,系統就會記錄診斷資訊。診斷結果包含執行器摘要,其中列出閒置執行器數量和閒置時間百分位數、有效工作分布、重組資料大小,以及快取的 RDD 大小。使用 spark.dynamicAllocation.diagnosis.logLevel 控制輸出記錄層級。 |
false |
spark.dynamicAllocation.profile |
設為 performance 或 cost,即可套用一組預先定義的設定,針對效能或成本效益進行最佳化。使用者定義的屬性會覆寫設定檔的預設值。詳情請參閱「Spark 動態分配設定檔」。 |
none |
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled |
設為 true 時,系統會為保留重組資料的執行程式啟用動態逾時計算功能。
系統不會使用靜態 spark.dynamicAllocation.shuffleTracking.timeout,而是根據儲存在執行器上的重組資料量計算逾時時間。這樣一來,執行程式就能更快釋出小型重組,同時讓大型重組保持運作更久。 |
false |
spark.reducer.fetchMigratedShuffle.enabled |
如果設為 true,當執行器因 Spark 動態分配而停用,導致擷取失敗時,系統會從 Spark 驅動程式擷取重組輸出位置。這可減少因隨機播放區塊從停用的執行器遷移至運作中的執行器而導致的 ExecutorDeadException 錯誤,並減少因 FetchFailedException 錯誤而導致的階段重試 (請參閱「ExecutorDeadException 導致的 FetchFailedException」)。這項屬性適用於 Managed Service for Apache Spark Spark 執行階段版本
1.1.12 以上版本和 2.0.20 以上版本。 |
false |
spark.scheduler.excludeShuffleSkewExecutors |
如果設為 true,則會避免在重組偏斜的執行器上排定工作,這類執行器具有大量重組資料或大量已完成的對應工作。這可減少重組偏斜,進而提升效能。 |
false |
Spark 動態分配設定檔
您可以將 spark.dynamicAllocation.profile 屬性設為 performance 或 cost,套用一組預先定義的 Spark 設定,以達到最佳效能或成本效益。除了設定 spark.dynamicAllocation.profile 屬性外,如果您還設定了 Spark 屬性,則設定會覆寫這些屬性的設定檔預設值。
performance:這個設定檔會套用下列預設設定,盡可能縮短執行時間:
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost:這個設定檔會套用下列預設設定,盡可能減少資源消耗:
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout:120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled:truespark.dynamicAllocation.diagnosis.enabled:true
Spark 動態分配指標
Spark 批次工作負載會產生下列與 Spark 動態資源分配相關的指標 (如要進一步瞭解 Spark 指標,請參閱「監控和檢測」)。
| 指標 | 說明 |
|---|---|
maximum-needed |
在目前負載下,滿足所有執行中和待處理工作所需的執行器數量上限。 |
running |
執行中的執行器數量。 |
Spark 動態分配問題和解決方案
ExecutorDeadException 導致 FetchFailedException
原因:Spark 動態分配功能縮減執行器時,會將重組檔案遷移至運作中的執行器。不過,由於執行器上的 Spark 縮減器工作會從 Spark 驅動程式在縮減器工作啟動時設定的位置擷取重組輸出內容,因此如果重組檔案已遷移,縮減器可能會繼續嘗試從已停用的執行器擷取重組輸出內容,導致
ExecutorDeadException和FetchFailedException錯誤。解決方法:執行 Managed Service for Apache Spark 批次工作負載時,將
spark.reducer.fetchMigratedShuffle.enabled設為true,啟用重組位置重新擷取功能 (請參閱「設定 Spark 批次工作負載屬性」)。啟用這項屬性後,如果從已停用的執行器擷取失敗,reducer 工作會從驅動程式重新擷取重組輸出位置。