自動調度工作負載 resource_allocation_properties

本文將說明 Managed Service for Apache Spark 自動調整功能。 提交 Spark 工作負載時,Managed Service for Apache Spark 可以動態調度工作負載資源 (例如執行器數量),有效率地執行工作負載。Managed Service for Apache Spark 自動調度資源是預設行為,並使用 Spark 動態資源分配,判斷是否要調度工作負載資源、調度方式和時機。

Managed Service for Apache Spark 自動調度 V2

Managed Service for Apache Spark 自動調度資源版本 2 (V2) 在預設版本 1 (V1) 中新增功能並進行改良,可協助您管理 Managed Service for Apache Spark 工作負載、提升工作負載效能,以及節省成本:

  • 非同步節點縮減:自動調度資源 V2 會以非同步縮減作業取代 V1 的同步縮減作業。使用非同步縮減功能時,Managed Service for Apache Spark 會縮減工作負載資源,而不必等待所有節點完成重組遷移作業。也就是說,緩慢縮減的長尾節點不會阻礙擴充。
  • 智慧型節點縮減選取:自動調度資源 V2 會以智慧型演算法取代 V1 的隨機節點選取,找出最適合優先縮減的節點。這項演算法會考量節點的隨機資料大小和閒置時間等因素。
  • 可設定的 Spark 正常終止和隨機遷移行為: 自動調度 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 自動調度版本。指定版本 12 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 工作負載的擴充作業。接受 01 之間的值。1.0 值可提供最大擴充能力,並協助達到最大平行處理程度。值為 0.5 時,擴充功能和並行程度會設為最大值的一半。 0.3
spark.dynamicAllocation.diagnosis.enabled 如果執行器在 spark.dynamicAllocation.diagnosis.interval 指定的時間內超出所需執行器數量上限,系統就會記錄診斷資訊。true診斷結果包括執行器摘要,其中包含閒置執行器數量和閒置時間百分位數、有效任務分配情形、隨機資料大小和快取 RDD 大小。使用 spark.dynamicAllocation.diagnosis.logLevel 控制輸出記錄檔層級。 false
spark.dynamicAllocation.profile 設為 performancecost,即可套用預先定義的設定組合,以最佳化效能或成本效益。使用者定義的屬性會覆寫設定檔的預設值。詳情請參閱 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 屬性設為 performancecost,套用預先定義的 Spark 設定組合,以達到最佳效能或成本效益。如果您除了設定 spark.dynamicAllocation.profile 屬性外,還設定了 Spark 屬性,系統會以您的設定覆寫這些屬性的設定檔預設值。

效能:這個設定檔會套用下列預設設定,盡可能縮短執行時間:

  • spark.scheduler.excludeShuffleSkewExecutorstrue
  • spark.dynamicAllocation.executorIdleTimeout300s
  • spark.dynamicAllocation.initialExecutors10

cost:這個設定檔會套用下列預設設定,盡量減少資源消耗:

  • spark.dynamicAllocation.executorIdleTimeout120s
  • spark.dynamicAllocation.cachedExecutorIdleTimeout120s
  • spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabledtrue
  • spark.dynamicAllocation.diagnosis.enabledtrue

Spark 動態分配指標

Spark 批次工作負載會產生下列與 Spark 動態資源分配相關的指標 (如要進一步瞭解 Spark 指標,請參閱「監控和儀表化」)。

指標 說明
maximum-needed 目前負載下,滿足所有執行中和待處理工作所需的執行器數量上限。
running 執行工作的執行者數量。

Spark 動態分配問題和解決方法

  • FetchFailedException (由 ExecutorDeadException 導致)

    原因:當 Spark 動態分配縮減執行器時,隨機播放檔案會遷移至即時執行器。不過,由於執行器上的 Spark reducer 工作會在 reducer 工作啟動時,從 Spark 驅動程式設定的位置擷取 shuffle 輸出內容,因此如果遷移 shuffle 檔案,reducer 可能會繼續嘗試從已停用的執行器擷取 shuffle 輸出內容,導致 ExecutorDeadExceptionFetchFailedException 錯誤。

    解決方案:執行 Managed Service for Apache Spark 批次工作負載時,將 spark.reducer.fetchMigratedShuffle.enabled 設為 true,啟用重組位置重新擷取功能 (請參閱「設定 Spark 批次工作負載屬性」)。啟用這項屬性後,如果從已停用的執行器擷取資料失敗,縮減器工作會從驅動程式重新擷取隨機播放輸出位置。