在自訂容器中執行 Dataflow 工作

在自訂容器中執行 Dataflow 工作,即可自訂 worker 執行階段環境,並預先安裝第三方依附元件。這種做法有助於確保各項工作負載的管道執行作業一致。

如需建立映像檔的操作說明,請參閱「建構 Dataflow 的自訂容器映像檔」。為避免在啟動管道時發生依附元件不相容的錯誤,請使用與自訂容器映像檔 SDK 相符的 Apache Beam SDK 版本和語言版本。

在本機測試

在 Dataflow 執行管道前,建議先在本機測試容器映像檔,這樣能加快測試和偵錯速度。

如要進一步瞭解 Apache Beam 專屬用法,請參閱 Apache Beam 指南,瞭解如何使用自訂容器映像檔執行管道。

使用 PortableRunner 進行基本測試

如要確認是否能提取遠端容器映像檔,以及是否能執行基本管道,請使用 Apache Beam PortableRunner。使用 PortableRunner 時,工作提交作業會在本機環境中進行,而 DoFn 執行作業則會在 Docker 環境中進行。

使用 GPU 時,Docker 容器可能無法存取 GPU。如要使用 GPU 測試容器,請使用直接執行工具,並按照「使用 GPU」頁面「使用獨立 VM 偵錯」一節中的步驟,在具有 GPU 的獨立 VM 上測試容器映像檔。

以下指令會執行範例管道:

Java

mvn compile exec:java -Dexec.mainClass=com.example.package.MyClassWithMain \
    -Dexec.args="--runner=PortableRunner \
    --jobEndpoint=REGION \
    --defaultEnvironmentType=DOCKER \
    --defaultEnvironmentConfig=IMAGE_URI \
    --inputFile=INPUT_FILE \
    --output=OUTPUT_FILE"

Python

python path/to/my/pipeline.py \
  --runner=PortableRunner \
  --job_endpoint=REGION \
  --environment_type=DOCKER \
  --environment_config=IMAGE_URI \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE

Go

go path/to/my/pipeline.go \
  --runner=PortableRunner \
  --job_endpoint=REGION \
  --environment_type=DOCKER \
  --environment_config=IMAGE_URI \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE

更改下列內容:

  • REGION:要使用的工作服務區域,格式為位址和通訊埠。例如:localhost:3000。使用 embed 執行程序內工作服務。
  • IMAGE_URI:自訂容器映像檔 URI。
  • INPUT_FILE::可讀取為 文字檔案的輸入檔案。這個檔案必須可由 SDK 控管工具
    容器映像檔存取,無論是預先載入容器映像檔或遠端檔案。
  • OUTPUT_FILE:寫入輸出的路徑。這個路徑可以是遠端路徑,也可以是容器上的本機路徑。

管道成功完成後,請查看控制台記錄,確認管道已成功完成,且使用了 IMAGE_URI 指定的遠端映像檔。

執行管道後,儲存至容器的檔案不會位於本機檔案系統中,且容器會停止。您可以使用 docker cp,從停止的容器檔案系統複製檔案。

您也可以使用以下程式碼:

  • 將輸出內容提供給 Cloud Storage 等遠端檔案系統。您可能需要手動設定測試用的存取權,包括憑證檔案或應用程式預設憑證。
  • 如要快速偵錯,請新增暫時記錄。

使用 Direct Runner

如要對容器映像檔和管道進行更深入的本機測試,請使用 Apache Beam Direct Runner。

您可以在與容器映像檔相符的本機環境中測試,或在執行中的容器上啟動管道,藉此驗證管道。

Java

docker run -it --entrypoint "/bin/bash" IMAGE_URI
...
# On docker container:
root@4f041a451ef3:/#  mvn compile exec:java -Dexec.mainClass=com.example.package.MyClassWithMain ...

Python

docker run -it --entrypoint "/bin/bash" IMAGE_URI
...
# On docker container:
root@4f041a451ef3:/#  python path/to/my/pipeline.py ...

Go

docker run -it --entrypoint "/bin/bash" IMAGE_URI
...
# On docker container:
root@4f041a451ef3:/#  go path/to/my/pipeline.go ...

將 IMAGE_URI 替換為自訂容器映像檔 URI。

範例假設所有管道檔案 (包括管道本身) 都在自訂容器上、已從本機檔案系統掛接,或位於遠端,且可由 Apache Beam 和容器存取。舉例來說,如要使用 Maven (mvn) 執行上述 Java 範例,必須在容器中暫存 Maven 及其依附元件。詳情請參閱 Docker 說明文件中的「Storage」(儲存空間) 和「docker run」。

在 Direct Runner 上測試的目標,是在自訂容器環境中測試管道,而不是測試使用預設 ENTRYPOINT 執行容器。修改 ENTRYPOINT (例如 docker run --entrypoint ...),直接執行管道,或允許在容器上手動執行指令。

如果您依賴特定設定,而該設定是以在 Compute Engine 上執行容器為基礎,則可以直接在 Compute Engine VM 上執行容器。詳情請參閱「Compute Engine 中的容器」。

啟動 Dataflow 工作

在 Dataflow 上啟動 Apache Beam 管道時,請指定容器映像檔的路徑。請勿在自訂映像檔中使用 :latest 標記。請在版本加上日期或專屬 ID 標記。如果發生問題,使用這類標記或許能將管道執行作業還原至先前已知的正常設定,並檢查變更。

Java

使用 --sdkContainerImage 為 Java 執行階段指定 SDK 容器映像檔。

如要啟用可攜式執行器,請根據 SDK 版本使用下列實驗:

  • Apache Beam SDK 2.74 以上版本:--experiments=enable_portable_runner。
  • Apache Beam SDK 2.73 以下版本:--experiments=use_runner_v2。

Python

如果使用 SDK 2.30.0 以上版本,請使用管道選項 --sdk_container_image 指定 SDK 容器映像檔。

如果使用舊版 SDK,請透過管道選項 --worker_harness_container_image 指定 worker 控管工具要使用的容器映像檔位置。

自訂容器僅適用於 Dataflow Portable Runner。如果您要啟動批次 Python 管道,請根據 SDK 版本設定實驗旗標:

  • Apache Beam SDK 2.74 以上版本:--experiments=enable_portable_runner。
  • Apache Beam SDK 2.73 以下版本:--experiments=use_runner_v2。

如果您要啟動串流 Python 管道,則不必指定實驗,因為串流 Python 管道預設會使用 Portable Runner。

Go

如果使用 SDK 2.40.0 以上版本,請使用管道選項 --sdk_container_image 指定 SDK 容器映像檔。

如果使用舊版 SDK,請透過管道選項 --worker_harness_container_image 指定 worker 控管工具要使用的容器映像檔位置。

所有版本的 Go SDK 都支援自訂容器,因為這些 SDK 預設使用 Dataflow Portable Runner。

以下範例說明如何使用自訂容器啟動批次 WordCount 範例。

Java

mvn -Pdataflow-runner compile exec:java \
    -Dexec.mainClass=org.apache.beam.examples.WordCount \
    -Dexec.args="--runner=DataflowRunner \
                 --inputFile=INPUT_FILE \
                 --output=OUTPUT_FILE \
                 --project=PROJECT_ID \
                 --region=REGION \
                 --gcpTempLocation=TEMP_LOCATION \
                 --diskSizeGb=DISK_SIZE_GB \
                 --experiments=use_runner_v2 \
                 --sdkContainerImage=IMAGE_URI"

Python

使用 Apache Beam SDK for Python 2.30.0 以上版本:

python -m apache_beam.examples.wordcount \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE \
  --project=PROJECT_ID \
  --region=REGION \
  --temp_location=TEMP_LOCATION \
  --runner=DataflowRunner \
  --disk_size_gb=DISK_SIZE_GB \
  --experiments=use_runner_v2 \
  --sdk_container_image=IMAGE_URI

Go

wordcount --input gs://dataflow-samples/shakespeare/kinglear.txt \
          --output gs://<your-gcs-bucket>/counts \
          --runner dataflow \
          --project your-gcp-project \
          --region your-gcp-region \
          --temp_location gs://<your-gcs-bucket>/tmp/ \
          --staging_location gs://<your-gcs-bucket>/binaries/ \
          --sdk_container_image=IMAGE_URI

更改下列內容:

  • INPUT_FILE:Dataflow 執行範例時讀取的 Cloud Storage 輸入路徑。
  • OUTPUT_FILE:範例管道寫入的 Cloud Storage 輸出路徑。這個檔案包含字數。
  • PROJECT_ID: Google Cloud專案的 ID。
  • REGION:部署 Dataflow 工作的區域。
  • TEMP_LOCATION:Cloud Storage 路徑,Dataflow 會將執行管道期間建立的暫時工作檔案暫存於此。
  • DISK_SIZE_GB:選用。如果容器較大,建議增加預設開機磁碟大小,以免磁碟空間用盡。
  • IMAGE_URI:SDK 自訂容器映像檔 URI。請一律使用有版本的容器 SHA 或標記。請勿使用 :latest 標記或可變動標記。

容器映像檔串流

啟用映像檔串流功能,即可縮短 Dataflow 管道的啟動和自動調度資源延遲時間。如果自訂容器包含不相關的內容,或並非在每個步驟都使用所有內容,這項功能就非常實用。舉例來說,容器可能包含附隨性內容,例如用於 GPU 推論的 CPU 程式庫程式碼。同樣地,您可能有一個容器,會執行具有多個模型的機器學習管道,但每個步驟只使用一個模型,因此不需要一次使用所有內容。在這種情況下,啟用圖片串流功能有助於改善延遲。

Java

--dataflowServiceOptions=enable_image_streaming

Python

--dataflow_service_options=enable_image_streaming

Go

--dataflow_service_options=enable_image_streaming

映像檔串流功能會根據管道程式碼的需求,擷取自訂容器的部分內容,而不是預先下載整個容器。容器中未使用的部分則完全不需要下載。

您必須啟用 Container File System API,才能使用映像檔串流功能。