自動調度工作負載 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 正常終止和隨機遷移行為: 透過 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 自動調度資源版本。指定版本 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 指定的時間範圍內,超出所需執行器的上限,系統就會記錄診斷資訊。診斷資訊包括執行器摘要,其中包含閒置執行器數量和閒置時間百分位數、有效工作分配、隨機資料大小和快取 RDD 大小。您可以使用 spark.dynamicAllocation.diagnosis.logLevel 控制輸出記錄層級。true 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 工作會從 Spark 驅動程式在 reducer 工作啟動時設定的位置擷取隨機播放輸出內容,因此如果隨機播放檔案遷移,reducer 可以繼續嘗試從已停用的執行器擷取隨機播放輸出內容,導致 ExecutorDeadExceptionFetchFailedException 錯誤。

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