Dataflow 成本最佳化最佳做法

本文說明最佳做法,協助您最佳化 Dataflow 工作,盡可能降低費用。說明影響費用的因素,並提供監控及管理費用的技術。

如要進一步瞭解 Dataflow 工作的費用計算方式,請參閱「Dataflow 定價」。

有幾項因素會大幅影響工作費用:

  • 執行階段設定
  • 管道效能
  • 管道處理量需求

以下各節將詳細說明如何監控工作、影響工作成本的因素,以及如何提高管道效率。

定義服務等級目標

開始最佳化之前,請先定義管道的服務水準目標 (SLO),尤其是處理量和延遲時間。這些需求條件可協助您在成本和其他因素之間做出取捨。

  • 如果管道需要較低的端對端擷取延遲時間,管道成本可能會較高。
  • 如需處理延遲抵達的資料,整體管道費用可能會較高。
  • 如果串流管道有資料尖峰需要處理,管道可能需要額外容量,這可能會增加費用。

監控工作

如要判斷如何最佳化工作,您必須先瞭解其行為。使用 Dataflow 監控工具,觀察管道執行時的情況。接著,您可以使用這項資訊提升成效和效率。

費用監控

請使用下列技巧預測及監控費用。

  • 在正式環境中執行管道前,請先對部分資料執行一或多項小型工作。對許多管道來說,這項技術可以提供費用預估。
  • 在 Dataflow 監控介面中,使用「Cost」(費用) 頁面監控工作的預估費用。預估費用可能因合約折扣等各種原因,而無法反映實際工作費用,但可做為成本最佳化的良好基準。詳情請參閱「費用監控」。
  • 將 Cloud Billing 資料匯出至 BigQuery,並對帳單匯出資料表執行費用分析。Cloud Billing 匯出功能可讓您將整天的詳細 Google Cloud 帳單資料自動匯出至 BigQuery 資料集。帳單資料包括用量、預估費用和定價資料。
  • 為避免產生非預期費用,請在 Dataflow 工作超過定義的門檻時,建立監控警告。詳情請參閱「使用 Cloud Monitoring 監控 Dataflow 管道」。

工作監控

監控工作,找出可提升管道效率的部分。

  • 使用 Dataflow 工作監控介面找出管道中的問題。監控介面會顯示每個管道的工作圖表和執行詳細資料。這兩項工具都能協助您瞭解管道,並找出速度緩慢、停滯或 wall time 過長的階段或步驟。
  • 使用 Metrics Explorer 查看詳細的 Dataflow 工作指標。您可以使用自訂指標擷取成效資料。Distribution 指標特別適合用於收集成效資料。
  • 如果是 CPU 密集型管道,請使用 Cloud Profiler 找出管道程式碼中耗用最多資源的部分。
  • 使用資料取樣找出資料問題。資料取樣功能可讓您觀察資料在 Dataflow 管道每個步驟中的狀態。這項資訊會顯示執行中或已完成工作的實際輸入和輸出內容,有助於您對管道問題進行偵錯。
  • 自訂專案監控資訊主頁,顯示可能費用高昂的工作。詳情請參閱「自訂 Dataflow 監控資訊主頁」。

不建議在高流量管道中記錄個別元素的處理指標,因為記錄功能有限制,過度記錄可能會降低工作效能。

最佳化執行階段設定

下列執行階段設定可能會影響費用:

  • 無論是執行串流工作或批次工作
  • 執行工作時使用的服務,例如 Streaming Engine 或 FlexRS
  • worker VM 的機型、磁碟大小和 GPU 數量
  • 自動調度資源模式
  • worker 的初始數量和數量上限
  • 串流模式 (「僅一次」模式或「至少一次」模式)

本節說明可最佳化工作的潛在變更。如要判斷這些建議是否適合您的工作負載,請考量管道設計和需求。並非所有建議都適用或有助於所有管道。

進行任何大規模變更前,請先在小型管道上測試變更,並使用部分資料。詳情請參閱「大型批次管道最佳做法」中的「針對大型工作執行小型實驗」。

工作地點

大多數 Dataflow 工作會與其他服務互動,例如資料儲存庫和訊息系統。請考量這些項目的位置。

  • 在工作使用的資源所在區域執行工作。
  • 建立 Cloud Storage bucket,用於儲存與工作位於相同區域的暫存和臨時工作檔案。詳情請參閱 gcpTempLocation 和 temp_location 管道選項。

調整機型

對 worker VM 進行下列調整,可能有助於提高成本效益。

  • 執行工作時,請使用符合需求的最小機型。請根據管道需求,視需要調整機器類型。舉例來說,如果串流工作的管道需要大量 CPU 資源,有時變更預設機型會帶來好處。詳情請參閱「機器類型」。
  • 如果是記憶體密集或運算密集型工作負載,請使用適當的機器類型。詳情請參閱「各系列 VM 的 CoreMark 分數」。
  • 設定 worker 的初始數量。工作擴充時,必須將工作重新分配給新的 VM。如果您知道工作需要多少 worker,可以設定初始 worker 數量,避免這項費用。如要設定 worker 的初始數量,請使用 numWorkers 或 num_workers 管道選項。
  • 設定 worker 數量上限。設定這個參數的值,即可限制工作的總費用。初次測試管道時,請先設定較低的上限。然後提高這個值,直到足以執行正式環境工作負載。設定上限前,請先考量管道服務等級目標 (SLO)。詳情請參閱「自動水平調度資源」。
  • 使用適當調整功能,自訂特定管道步驟的資源需求。
  • 部分管道適合使用 GPU。詳情請參閱「Dataflow 的 GPU」。您可以透過適當調整,為管道的特定步驟設定 GPU。
  • 請確認您有足夠的網路頻寬,可從 worker VM 存取資料,尤其是在需要存取地端部署資料時。

調整批次工作設定

本節提供最佳化批次工作執行階段設定的建議。如果是批次工作,工作階段會依序執行,這可能會影響效能和費用。

使用彈性資源排程

如果批次工作沒有時效性,建議使用彈性資源排程 (FlexRS)。FlexRS 會找出最適合啟動工作的時間,然後結合使用先占 VM 執行個體和標準 VM,藉此降低批次處理費用。先占 VM 的價格比標準 VM 低得多,可降低總成本。FlexRS 會結合使用先占和標準 VM,確保即使 Compute Engine 先占了先占 VM,管道仍能繼續運作。

避免執行超小型工作

如果可行,請避免執行處理極少量資料的工作。如果可以,請在較大的資料集上執行較少的工作。啟動和停止 worker VM 會產生費用,因此在較多資料上執行較少工作,可提高效率。

確認已啟用 Dataflow Shuffle。批次工作預設會使用 Dataflow Shuffle。

調整自動調度資源設定

根據預設,批次工作會使用自動調度資源功能。某些工作 (例如短時間執行的工作) 不需要自動調度資源。如果您認為管道無法從自動調度資源功能中受益,請關閉這項功能。詳情請參閱「自動水平調度資源」。

您也可以使用動態執行緒資源配置,讓 Dataflow 根據 CPU 使用率調整執行緒數量。或者,如果您知道工作的最佳執行緒數量,可以使用 numberOfWorkerHarnessThreads 或 number_of_worker_harness_threads 管道選項,明確設定每個 worker 的執行緒數量。

停止長時間執行的工作

設定工作在超過預定執行時間時自動停止。如果您大致知道工作需要多久時間才能執行完畢,請使用 max_workflow_runtime_walltime_seconds 服務選項,在工作執行時間超過預期時自動停止工作。

調整串流工作的設定

本節提供最佳化串流工作執行階段設定的建議。

使用 Streaming Engine

Streaming Engine 會將管道執行作業從 worker VM 移至 Dataflow 服務後端,以提高效率。建議使用 Streaming Engine 處理串流工作。

考慮使用「至少一次」模式

Dataflow 支援兩種串流工作模式:「僅一次」模式和「至少一次」模式。如果工作負載可以容許重複記錄,則「至少一次」模式可大幅降低工作費用。啟用「至少一次」模式前,請先評估管道是否需要僅需處理一次記錄。詳情請參閱「設定管道串流模式」。

選擇計價模式

Dataflow 串流工作的承諾使用折扣 (CUD) 是指您承諾持續使用一定數量的 Dataflow 運算資源一年以上,即可享有折扣價。如果 Dataflow 串流工作的運算能力支出,有可預測的最低金額,且您能承諾至少一年達到該金額,就適合使用 Dataflow CUD。使用 CUD 有機會降低 Dataflow 工作的費用。

您也可以考慮使用依資源計費。採用以資源為準的計費模式時,系統會以 Streaming Engine 運算單元為單位,計算及測量工作耗用的 Streaming Engine 資源。您需要支付 worker CPU、worker 記憶體和 Streaming Engine 運算單元的費用。

調整自動調度資源設定

使用自動調度資源提示和延遲時間級別,調整自動調度資源設定。詳情請參閱「調整串流管道的水平自動調度資源」。如果串流工作使用 Streaming Engine,您可以更新自動調整設定,不必停止或取代工作。詳情請參閱「執行中工作選項更新」。

如果您認為管道無法從自動調度資源功能中受益,請關閉這項功能。詳情請參閱「自動水平調度資源」。

如果您知道工作的最佳執行緒數量,請使用 numberOfWorkerHarnessThreads 或 number_of_worker_harness_threads 管道選項,明確設定每個 worker 的執行緒數量。

停止長時間執行的工作

如果是串流工作,Dataflow 會無限期重試失敗的作業項目。工作未終止。不過,工作可能會停滯,直到問題解決為止。建立監控政策,偵測管道停滯的跡象,例如系統延遲時間增加和資料更新間隔縮短。在管道程式碼中導入錯誤記錄功能,有助於找出重複失敗的工作項目。

管道效能

執行速度較快的管道可能費用較低。下列因素可能會影響管道效能:

  • 工作可用的平行處理數量
  • 管道中使用的轉換、I/O 連接器和編碼器的效率
  • 資料位置

如要提升管道效能,第一步是瞭解處理模型:

  • 瞭解 Apache Beam 模型和 Apache Beam 執行模型。
  • 進一步瞭解管道生命週期,包括 Dataflow 如何管理平行處理作業,以及採用的最佳化策略。Dataflow 工作會使用多個 worker VM,每個 worker 則會執行多個執行緒。PCollection 的元素套件會分配給每個背景工作執行緒。

編寫管道程式碼時,請遵循下列最佳做法:

記錄

記錄時,請遵循下列最佳做法:

測試

測試管道有許多好處,包括協助 SDK 升級、管道重構和程式碼審查。許多最佳化作業 (例如重新設計自訂 CPU 密集型轉換) 都可以直接在本機測試,不必在 Dataflow 執行工作。

使用工作負載的實際測試資料,測試大規模管道,包括批次管道的元素總數、串流管道每秒的元素數量、元素大小和索引鍵數量。請在兩種模式下測試管道:穩定狀態,以及處理大量待處理工作以模擬當機復原。

如要進一步瞭解如何建立單元測試、整合測試和端對端測試,請參閱「測試管道」。如需測試範例,請參閱 dataflow-ordered-processing GitHub 存放區。

後續步驟