在 Cloud Dataflow 中使用彈性資源排程

本頁說明如何在 Dataflow 中,為自動調度資源的批次管道啟用彈性資源排程 (FlexRS)。

FlexRS 會使用進階排程技術、Dataflow Shuffle 服務,並結合先占虛擬機器 (VM) 執行個體和一般 VM,藉此減少批次處理費用。Dataflow 會平行執行先占 VM 和一般 VM,因此當 Compute Engine 在系統事件期間停止先占 VM 執行個體時,使用者體驗不會受到影響。FlexRS 可確保管道持續運作,並在 Compute Engine 占用先占 VM 時,避免您遺失先前的工作。

使用 FlexRS 的工作會使用以服務為基礎的 Dataflow Shuffle 進行聯結和分組。因此,FlexRS 工作不會使用 Persistent Disk 資源儲存暫時的計算結果。使用 Dataflow Shuffle 可讓 FlexRS 更妥善地處理 worker VM 的搶占作業,因為 Dataflow 服務不必將資料重新分配給其餘 worker。每個 Dataflow 工作人員仍需 25 GB 的小型永久磁碟磁碟區,才能儲存機器映像檔和暫時記錄。

支援與限制

  • 支援批次管道。
  • 需要 Apache Beam SDK for Java 2.12.0 以上版本、Apache Beam SDK for Python 2.12.0 以上版本,或 Apache Beam SDK for Go。
  • 使用 Dataflow Shuffle。 啟用 FlexRS 後,系統會自動啟用 Dataflow Shuffle。
  • 不支援 GPU。
  • 不支援 Compute Engine 預留項目。
  • FlexRS 工作會出現排程延遲,因此,FlexRS 最為適合用於沒有時間要求的工作負載,例如能夠於特定時間範圍內完成的每日或每週工作。

延遲排程

提交 FlexRS 工作時,Dataflow 服務會將工作放入佇列,並在工作建立後六小時內提交執行。Dataflow 會根據可用容量和其他因素,在該時間範圍內找出啟動工作的最佳時間。

提交 FlexRS 工作時,Dataflow 服務會執行下列步驟:

  1. 工作提交後,系統會立即傳回工作 ID。
  2. 執行初步驗證作業。
  3. 根據早期驗證結果決定下一個步驟。

    1. 若結果為成功,工作會排入佇列,並等待延遲啟動。
    2. 在其他情況下,作業會失敗,且 Dataflow 服務會回報錯誤。

如果驗證成功,Dataflow 監控介面會顯示工作 ID 和狀態 Queued。如果驗證失敗,工作會顯示 Failed 狀態。

初步驗證

提交 FlexRS 工作後,系統不會立即啟動工作。在早期驗證期間,Dataflow 服務會驗證執行參數和Google Cloud 環境設定,例如 IAM 角色和網路設定。Dataflow 會在提交工作時盡可能驗證工作,並回報潛在錯誤。您不需為此初步驗證流程支付費用。

初步驗證步驟不會執行使用者程式碼。您必須透過 Apache Beam Direct Runner 或者非 FlexRS 的工作,驗證您的程式碼,檢查是否有問題。如果工作建立和工作延遲排定之間發生環境變更,工作可能在早期驗證期間成功,但仍會在啟動時失敗。 Google Cloud

啟用 FlexRS

建立 FlexRS 工作時,即使工作處於「已加入佇列」狀態,系統也會占用並行工作配額。提早驗證程序不會驗證或保留任何其他配額。因此,啟用 FlexRS 前,請先確認您有足夠的 Google Cloud 專案資源配額可啟動工作。這包括可搶占 CPU、一般 CPU 和 IP 位址的額外配額,除非您關閉公開 IP 參數。

如果配額不足,帳戶在部署 FlexRS 工作時可能沒有足夠的資源。Dataflow 預設會為 worker 集區中 90% 的 worker 選取先占 VM。規劃 CPU 配額時,請務必確認您有足夠的先占 VM 配額。您可以明確要求先占 VM 配額;否則,FlexRS 作業會缺少資源,無法及時執行。

定價

FlexRS 工作會依據下列資源計費:

  • 一般和先占 CPU
  • 記憶體資源
  • Dataflow Shuffle 資源
  • 每個工作站 25 GB 的 Persistent Disk 資源

Dataflow 會使用先占和一般 worker 執行 FlexRS 工作,但無論 worker 類型為何,系統都會以統一的折扣費率計費,相較於一般 Dataflow 價格更划算。Dataflow Shuffle 和永久磁碟資源不適用折扣。

詳情請參閱「Dataflow 定價詳細資料」頁面。

管道選項

Java

如要啟用 FlexRS 工作,請使用下列管道選項:

  • --flexRSGoal=COST_OPTIMIZED,其中「成本最佳化目標」是指 Dataflow 服務會選擇任何可用的折扣資源。

  • --flexRSGoal=SPEED_OPTIMIZED,以盡量縮短執行時間。如未指定,欄位 --flexRSGoal 預設為 SPEED_OPTIMIZED,這與省略這個標記相同。

彈性 RS 工作會影響下列執行參數:

  • numWorkers 只會設定工作站的初始數量。不過,您可以基於成本控管考量設定 maxNumWorkers。
  • 彈性資源排程 (FlexRS) 工作無法使用 autoscalingAlgorithm 選項。
  • 您無法為 FlexRS 工作指定 zone 旗標。Dataflow 服務會為您使用 region 參數指定的區域中,所有 FlexRS 工作選取可用區。
  • 您必須選取「Dataflow location」(資料流位置)做為 region。
  • workerMachineType 不支援 M2、M3 或 H3 系列機器。

下列範例說明如何將參數新增至您的一般管道參數,以便使用 FlexRS:

--flexRSGoal=COST_OPTIMIZED \
--region=europe-west1 \
--maxNumWorkers=10 \
--workerMachineType=n1-highmem-16

如果省略 region、maxNumWorkers 和 workerMachineType,Dataflow 服務會決定預設值。

Python

如要啟用 FlexRS 工作,請使用下列管道選項:

  • --flexrs_goal=COST_OPTIMIZED,其中「成本最佳化目標」是指 Dataflow 服務會選擇任何可用的折扣資源。

  • --flexrs_goal=SPEED_OPTIMIZED,以盡量縮短執行時間。如未指定,欄位 --flexrs_goal 預設為 SPEED_OPTIMIZED,這與省略這個標記相同。

彈性 RS 工作會影響下列執行參數:

  • num_workers 只會設定工作站的初始數量。不過,您可以基於成本控管考量設定 max_num_workers。
  • 彈性資源排程 (FlexRS) 工作無法使用 autoscalingAlgorithm 選項。
  • 您無法為 FlexRS 工作指定 zone 旗標。Dataflow 服務會為您使用 region 參數指定的區域中,所有 FlexRS 工作選取可用區。
  • 您必須選取「Dataflow location」(資料流位置)做為 region。
  • machine_type 不支援 M2、M3 或 H3 系列機器。

下列範例說明如何將參數新增至您的一般管道參數,以便使用 FlexRS:

--flexrs_goal=COST_OPTIMIZED \
--region=europe-west1 \
--max_num_workers=10 \
--machine_type=n1-highmem-16

如果省略 region、max_num_workers 和 machine_type,Dataflow 服務會決定預設值。

Go

如要啟用 FlexRS 工作,請使用下列管道選項:

  • --flexrs_goal=COST_OPTIMIZED,其中「成本最佳化目標」是指 Dataflow 服務會選擇任何可用的折扣資源。

  • --flexrs_goal=SPEED_OPTIMIZED,以盡量縮短執行時間。如未指定,欄位 --flexrs_goal 預設為 SPEED_OPTIMIZED,這與省略這個標記相同。

彈性 RS 工作會影響下列執行參數:

  • num_workers 只會設定工作站的初始數量。不過,您可以基於成本控管考量設定 max_num_workers。
  • 彈性資源排程 (FlexRS) 工作無法使用 autoscalingAlgorithm 選項。
  • 您無法為 FlexRS 工作指定 zone 旗標。Dataflow 服務會為您使用 region 參數指定的區域中,所有 FlexRS 工作選取可用區。
  • 您必須選取「Dataflow location」(資料流位置)做為 region。
  • worker_machine_type 不支援 M2、M3 或 H3 系列機器。

下列範例說明如何將參數新增至您的一般管道參數,以便使用 FlexRS:

--flexrs_goal=COST_OPTIMIZED \
--region=europe-west1 \
--max_num_workers=10 \
--machine_type=n1-highmem-16

如果省略 region、max_num_workers 和 machine_type,Dataflow 服務會決定預設值。

Dataflow 範本

部分 Dataflow 範本不支援 FlexRS 管道選項。或者,您也可以使用下列管道選項。

--additional-experiments=flexible_resource_scheduling,shuffle_mode=service,delayed_launch

監控 FlexRS 工作

您可以在 Google Cloud 控制台的兩個位置監控 FlexRS 工作的狀態:

  1. 顯示所有工作的「工作」頁面。
  2. 您提交的工作的監控介面頁面。

在「Jobs」(工作) 頁面上,尚未開始的工作狀態會顯示為「Queued」(已排入佇列)。

 Google Cloud 控制台中的 Dataflow 工作清單,其中包含狀態為「已排入佇列」的工作。
圖 1: Google Cloud 控制台中的 Dataflow 工作清單,其中包含狀態為「已加入佇列」的工作。

在「監控介面」頁面中,佇列中等待執行的工作會在「工作圖表」分頁中顯示「工作開始後會顯示圖表」訊息。

Cloud Dataflow 監控介面中,已加入佇列的個別管道工作。
圖 2:Dataflow 監控介面中顯示的已排隊個別管道工作。