在 Dataflow 上設計彈性且有效率的流程

本文說明彈性與效率設計 (DFE),這是一組架構最佳做法,可建構彈性 Dataflow 管道。

從嚴格的基礎架構限制轉移至彈性資源定義,有助於:

  • 盡可能取得運算資源。
  • 確保在區域需求量高時,自動調度資源作業能順利進行。
  • 避免管道啟動延遲,並消除容量瓶頸。

舉例來說,您可以設定最低資源需求 (例如 4 個 vCPU 和 16 GB 的 RAM),而不是將管道限制在單一可用區的特定機型 (例如 us-central1-a 中的 n1-standard-4 工作人員)。如果 us-central1-a 或 N1 系列機器暫時受到容量限制,Dataflow 可以在其他可用區和機器系列 (例如 E2、N2 或 N2D) 中,自動佈建相容的工作站 VM。這種彈性有助於確保管道啟動和擴充時,不必等待單一受限的硬體集區。

本文適用於管理 Dataflow 工作負載的資料工程師、雲端架構師和平台管理員,協助他們提升管道可靠性、總處理量和基礎架構可用性。

DFE 總覽

Dataflow 是全代管的無伺服器資料處理服務,可動態佈建 Compute Engine 虛擬機器 (VM) 執行個體,執行 Apache Beam 管道。在大型批次處理和串流管道中,worker 集區經常會擴充至數十或數百個 VM 執行個體。

如果管道設定了嚴格的基礎架構限制,在高需求量期間就可能發生佈建延遲。嚴格限制的例子包括:

  • 將單一機型 (例如 n1-standard-4) 硬式編碼。
  • 將管道固定至特定 Compute Engine 可用區。

如果該特定機型或可用區暫時需求量過高,Dataflow 就無法分配運算資源。這可能會導致佈建延遲或發生錯誤,例如 ZONE_RESOURCE_POOL_EXHAUSTED 或 RESOURCE_POOL_EXHAUSTED。

運用 DFE 原則,有助於將管道架構從僵硬的靜態基礎架構宣告,轉移至彈性且以需求為基礎的資源定義。這項彈性功能可讓 Dataflow 在 Google Cloud中,動態將運算作業分配到各種可用的硬體集區,協助您盡量取得運算資源,同時減少作業負擔。

DFE 最佳做法

請採用下列最佳做法,盡量提高運算資源的可用性、提升自動調度資源的反應速度,並建構彈性管道。

啟用自動選取 VM

請使用 Auto VM selection 和 Apache Beam 資源提示,而不是透過 worker 機型 管道選項,硬式編碼靜態機型。指定最低資源需求 (min_ram 或 cpu_count) 時,Dataflow 會自動啟用執行個體彈性,並從相容的機型清單中佈建工作站。

工作負載支援:

  • 批次管道:指定資源提示時,系統會自動啟用「適當大小」和「自動選取 VM」。
  • 串流管道:如要適當調整資源,必須設定 --experiments=enable_streaming_rightfitting 管道選項,並啟用水平自動調度資源 (預設為啟用) 和 Streaming Engine (--enable_streaming_engine)。

如要設定自動 VM 選取功能,請使用指令列選項、SDK 管道選項或彈性範本執行參數,在管道層級指定最低資源需求 (min_ram 或 cpu_count)。如需 Java 和 Python 的詳細設定說明和程式碼範例,請參閱「使用資源提示」。

使用區域工作站位置 (避免可用區釘選)

設定 Dataflow,在所選區域內的所有正常運作可用區中,動態排定 worker VM。

指定 --region 管道選項,並省略 --zone 和 --worker_zone。例如:

--region=us-central1

使用代管服務分離狀態和隨機排序

如果管道未使用受管理後端服務,系統會直接在 worker VM 的磁碟和記憶體中執行資料重組作業,並儲存串流狀態。這種緊耦合需要較大的 worker 磁碟,並將工作負載的存續期繫結至特定 VM 執行個體,因此在容量限制期間更難以替換 worker。

  • 批次工作 - 使用 Dataflow Shuffle: 針對在支援的工作站機型上執行的批次管道,系統預設會啟用 Dataflow Shuffle,並將資料重組作業從工作站 VM 卸載至 Google 代管的專屬後端服務。
  • 串流工作 - 使用 Streaming Engine: Streaming Engine 會將視窗狀態儲存空間和計時器管理作業,從工作站 VM 卸載至專用的高回應速度後端基礎架構。如果管道使用 Apache Beam SDK 2.30.0 以上版本,Streaming Engine 預設為啟用。如要顯式啟用,請傳遞 --enable_streaming_engine 管道選項。

針對批次管道使用彈性資源排程 (FlexRS)

對於非時間關鍵的批次工作負載 (例如每晚 ETL、資料湖泊擷取或每日匯總),請使用彈性資源排程 (FlexRS)。

如要啟用 FlexRS,請設定 flexRS 目標管道選項:

  • Python 管道:--flexrs_goal=COST_OPTIMIZED
  • Java 管道:--flexRSGoal=COST_OPTIMIZED

為 Flex 範本設定彈性啟動器 VM 類型

使用 Flex 範本啟動管道時,管道啟動器 VM 預設為 e2-standard-2。在大多數情況下,預設 VM 都能正常運作,但如果遇到容量限制,您可以在執行 gcloud dataflow flex-template run 指令時使用 --launcher-machine-type 選項,自訂設定:

gcloud dataflow flex-template run my-job \
    --template-file-gcs-location="gs://my-bucket/template.json" \
    --region="us-central1" \
    --launcher-machine-type="n2-standard-2"

作業考量和取捨

採用 DFE 最佳做法可大幅提升運算資源取得率、自動調度資源回應速度和運作可靠性,但設計架構時,請考量下列運作因素和取捨:

自動選取 VM 的注意事項

  • 可靠性與最高效能:自動 VM 選取功能會優先考量工作啟動可靠性和運算資源取得能力,而非最高執行效能。由於 Dataflow 會從多個候選機器家族 (例如 E2、N2、N4 和 N2D) 佈建資源,因此執行階段效能和處理量可能會因佈建的機器家族而略有不同。對於執行 SLA 嚴格的運算密集型工作負載,請先使用自動 VM 選取功能測試管道,建立效能基準,再廣泛部署。如果工作負載需要特定硬體平台或時脈速度,且您可容忍容量限制,則可繼續設定特定機型。
  • 候選系列適用的 Compute Engine 配額:由於自動虛擬機器選取功能可從多個候選機器系列佈建工作站,請確保 Google Cloud 專案在目標區域中,為每個候選系列提供足夠的 Compute Engine vCPU 和記憶體配額。如果主要家庭發生容量不足的情況,且專案缺少備援家庭的配額,系統就會因 QUOTA_EXCEEDED 錯誤而無法佈建 worker。
  • 串流管道的必要條件:對於串流管道,系統預設不會啟用適當大小和自動 VM 選取功能。您必須明確指定 --experiments=enable_streaming_rightfitting,並確保 Streaming Engine (--enable_streaming_engine) 和水平自動調度資源功能都已啟用。
  • 設定排除項目:如果您設定下表中的任何功能或選項,系統會自動略過或不支援自動選取 VM:

    功能 旗標或設定選項 附註
    明確的機型 --worker_machine_type 或 --machine_type (Python)
    --workerMachineType (Java)
    系統會略過自動 VM 選取功能,改用指定的機型。
    自訂磁碟類型、佈建的 IOPS 或處理量 --disk_type、--disk_provisioned_iops 或 --disk_provisioned_throughput_mibps 系統會略過自動 VM 選取程序。系統支援使用 --disk_size_gb 設定自訂磁碟大小。
    最低 CPU 平台 --min_cpu_platform (Python)
    --minCpuPlatform (Java)
    設定最低 CPU 平台會略過自動 VM 選取功能。
    Confidential VM --experiments=enable_confidential_compute 自動選取 VM 不支援機密 VM 執行個體。
    GPU 或 TPU 加速器 --dataflow_service_options=worker_accelerator=... 或 accelerator 資源提示 自動選取 VM 僅適用於沒有加速器的工作負載。
    Dataflow Prime --dataflow_service_options=enable_prime Dataflow Prime 使用垂直自動調度資源和動態適當調整大小功能,而非自動 VM 選取功能。
    彈性資源排程 (FlexRS) --flexrs_goal=COST_OPTIMIZED (Python)
    --flexRSGoal=COST_OPTIMIZED (Java)
    FlexRS 會管理自己的工作站集區和排程緩衝區。

彈性資源排程 (FlexRS) 的取捨

  • 排程延遲時間:FlexRS 最多可能在工作執行前 6 小時,才開始排程。如果管道的完成時間服務等級協議 (SLA) 嚴格,或下游依附元件緊密,請勿使用 FlexRS。

區域刊登位置和資料位置

  • 代管服務必要條件:只有使用 Dataflow Shuffle 處理批次資料,或使用 Streaming Engine 處理串流資料的工作,才支援區域工作站刊登位置。未使用這些代管後端服務的工作會採用自動可用區放置功能,系統會從區域內選取最合適的單一可用區。
  • 資料區域性和跨區域輸出:區域性放置會將工作人員分散到所選區域內的可用區。為盡量減少網路延遲,並避免跨區域網路輸出費用,請確保所有資料來源和接收器 (例如 Cloud Storage bucket、BigQuery 資料集和 Pub/Sub 主題) 都與 Dataflow 工作位於同一區域。

Compute Engine 預留項目

  • 預留項目親和性:隨選 Dataflow 工作會自動使用符合條件的 Compute Engine 預留項目,這些預留項目會使用ANY預留項目親和性。不過,「自動選取 VM」功能不支援從特定具名預留項目取用執行個體。
  • 適合用於暫時性工作負載:一般來說,不建議將 Compute Engine 預留資源用於容易發生用量暴增、自動調度資源或短期批次工作負載。此外,如果區域短缺問題尚未解決,建立新預留項目時,也會遇到與建立隨選 VM 相同的容量限制。

後續步驟