Dataproc Serverless for Spark 自動調整資源

本文件提供 Dataproc Serverless for Spark 自動調整資源的相關資訊。提交 Spark 工作負載時,Dataproc Serverless for Spark 可動態調整工作負載資源 (例如執行者數量),以便有效率地執行工作負載。Dataproc Serverless 自動調度資源是預設行為,會使用 Spark 動態資源分配來決定是否、如何以及何時要調度工作負載。

Dataproc Serverless 自動調整大小功能第 2 版

Dataproc 無伺服器自動調度功能第 2 版 (V2) 為預設第 1 版 (V1) 新增功能和改善項目,協助您管理 Dataproc 無伺服器工作負載、改善工作負載效能,並節省成本:

  • 非同步節點縮減:自動調度資源 V2 會以非同步縮減取代 V1 的同步縮減。使用非同步縮減功能,Dataproc Serverless 可縮減工作負載資源,而無須等待所有節點完成資料重組遷移作業。也就是說,縮放速度較慢的長尾節點不會阻止升級。
  • 智慧型縮減節點選取功能:Autoscaling V2 會使用智慧型演算法取代 V1 的隨機節點選取功能,以便找出最適合先縮減的節點。這個演算法會考量節點的隨機資料大小和閒置時間等因素。
  • 可設定的 Spark 優雅停用和排序遷移行為:Autoscaling V2 可讓您使用標準 Spark 屬性設定 Spark 優雅停用和排序遷移作業。這項功能可協助您維持與自訂 Spark 資源的相容性。

Dataproc Serverless 自動調度資源功能

功能 Dataproc Serverless 自動調度資源功能第 1 版 Dataproc Serverless 自動調度資源功能第 2 版
節點縮減 同步 非同步
縮減節點的選取方式 隨機 智慧技術
Spark 安全停用和排序遷移 無法設定 可自行設定

Spark 動態分配屬性

下表列出Spark 動態分配屬性,可在提交批次工作負載以控制自動調度資源時設定 (請參閱如何設定 Spark 屬性)。

屬性 說明 預設
spark.dataproc.scaling.version Dataproc Serverless Spark 自動調度資源版本。指定版本 12 (請參閱「Dataproc Serverless 自動調度資源功能 V2」)。 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.reducer.fetchMigratedShuffle.enabled 將其設為 true 時,可在 Spark 動態分配導致執行緒退役後,從 Spark 驅動程式擷取排序輸出位置。這麼做可減少從已停用的執行緒遷移至實際執行緒時,因隨機區塊遷移作業而導致的 ExecutorDeadException 錯誤,並減少因 FetchFailedException 錯誤而導致的階段重試 (請參閱「FetchFailedException 由 ExecutorDeadException 所造成」)。這個屬性適用於 Dataproc Serverless Spark 執行階段版本 1.1.12 以上版本和 2.0.20 以上版本。 false

Spark 動態分配指標

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

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

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

  • ExecutorDeadException 導致 FetchFailedException

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

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