构建和运行 Flex 模板


借助 Dataflow Flex 模板,您可以打包 Dataflow 流水线以进行部署。本教程介绍了如何构建 Dataflow Flex 模板,然后使用该模板运行 Dataflow 作业。

目标

  • 构建 Dataflow Flex 模板。
  • 使用该模板运行 Dataflow 作业。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Dataflow, Compute Engine, Logging, Cloud Storage, Cloud Storage JSON, Resource Manager, Artifact Registry, and Cloud Build API:

    gcloud services enable dataflow compute_component logging storage_component storage_api cloudresourcemanager.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
  7. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

  8. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/iam.serviceAccountUser

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  9. Install the Google Cloud CLI.
  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Make sure that billing is enabled for your Google Cloud project.

  13. Enable the Dataflow, Compute Engine, Logging, Cloud Storage, Cloud Storage JSON, Resource Manager, Artifact Registry, and Cloud Build API:

    gcloud services enable dataflow compute_component logging storage_component storage_api cloudresourcemanager.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
  14. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

  15. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/iam.serviceAccountUser

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  16. 向您的 Compute Engine 默认服务账号授予角色。对以下每个 IAM 角色运行以下命令一次:

    • roles/dataflow.admin
    • roles/dataflow.worker
    • roles/storage.objectAdmin
    • roles/artifactregistry.writer
    gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" --role=SERVICE_ACCOUNT_ROLE

    替换以下内容:

    • PROJECT_ID:您的项目 ID
    • PROJECT_NUMBER:您的项目编号
    • SERVICE_ACCOUNT_ROLE:每个角色

准备环境

安装 SDK 以及针对开发环境的任何要求。

Java

  1. 下载并安装 Java Development Kit (JDK) 版本 11。验证 JAVA_HOME 环境变量是否已设置并指向您的 JDK 安装。

  2. 下载 Apache Maven,并按照适用于您的具体操作系统的 Maven 安装指南进行安装。

Python

安装 Python 版 Apache Beam SDK

Go

使用 Go 的下载和安装指南下载并安装适用于您的具体操作系统的 Go。如需了解 Apache Beam 支持的 Go 运行时环境,请参阅 Apache Beam 运行时支持

下载代码示例。

Java

  1. 克隆 java-docs-samples 代码库

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
  2. 找到本教程的代码示例。

    cd java-docs-samples/dataflow/flex-templates/getting_started
  3. 在 Uber JAR 文件中构建 Java 项目。

    mvn clean package

    此 Uber JAR 文件中嵌入了所有依赖项。您可以将此文件作为在其他库上没有外部依赖项的独立应用运行。

Python

  1. 克隆 python-docs-samples 代码库

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
  2. 找到本教程的代码示例。

    cd python-docs-samples/dataflow/flex-templates/getting_started

Go

  1. 克隆 golang-samples 代码库

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git
  2. 找到本教程的代码示例。

    cd golang-samples/dataflow/flex-templates/wordcount
  3. 编译 Go 二进制文件。

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o wordcount .

创建 Cloud Storage 存储桶

使用 gcloud storage buckets create 命令创建 Cloud Storage 存储桶:

gcloud storage buckets create gs://BUCKET_NAME

BUCKET_NAME 替换为您的 Cloud Storage 存储桶的名称。Cloud Storage 存储桶名称必须是全局唯一的,并且符合存储桶命名要求

创建 Artifact Registry 代码库

创建一个您将模板的 Docker 容器映像推送到其中的 Artifact Registry 制品库。

  1. 使用 gcloud artifacts repositories create 命令创建新的 Artifact Registry 制品库。

    gcloud artifacts repositories create REPOSITORY \
     --repository-format=docker \
     --location=LOCATION

    替换以下内容:

    • REPOSITORY:代码库的名称。制品库名称对于项目中的每个制品库位置必须是唯一的。
    • LOCATION:制品库的单区域或多区域位置
  2. 使用 gcloud auth configure-docker 命令配置 Docker 以对 Artifact Registry 的请求进行身份验证。此命令会更新 Docker 配置,以便您可以与 Artifact Registry 连接来推送映像。

    gcloud auth configure-docker LOCATION-docker.pkg.dev

Flex 模板还可以使用存储在私有注册表中的映像。如需了解详情,请参阅使用私有注册表中的映像

构建 Flex 模板

在此步骤中,您将使用 gcloud dataflow flex-template build 命令构建 Flex 模板。

Flex 模板由以下组件组成:

  • 用于打包流水线代码的 Docker 容器映像。对于 Java 和 Python Flex 模板,当您运行 gcloud dataflow flex-template build 命令时,系统会构建 Docker 映像并将其推送到 Artifact Registry 代码库。
  • 模板规范文件。此文件是一个 JSON 文档,其中包含容器映像的位置以及有关模板的元数据,例如流水线参数。

GitHub 中的示例代码库包含 metadata.json 文件。

如需使用其他元数据扩展模板,您可以创建自己的 metadata.json 文件

Java

gcloud dataflow flex-template build gs://BUCKET_NAME/getting_started-java.json \
 --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/getting-started-java:latest" \
 --sdk-language "JAVA" \
 --flex-template-base-image JAVA11 \
 --metadata-file "metadata.json" \
 --jar "target/flex-template-getting-started-1.0.jar" \
 --env FLEX_TEMPLATE_JAVA_MAIN_CLASS="com.example.dataflow.FlexTemplateGettingStarted"

替换以下内容:

  • BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
  • LOCATION:位置
  • PROJECT_ID:Google Cloud 项目 ID
  • REPOSITORY:您之前创建的 Artifact Registry 制品库的名称

Python

gcloud dataflow flex-template build gs://BUCKET_NAME/getting_started-py.json \
 --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/getting-started-python:latest" \
 --sdk-language "PYTHON" \
 --flex-template-base-image "PYTHON3" \
 --metadata-file "metadata.json" \
 --py-path "." \
 --env "FLEX_TEMPLATE_PYTHON_PY_FILE=getting_started.py" \
 --env "FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE=requirements.txt"

替换以下内容:

  • BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
  • LOCATION:位置
  • PROJECT_ID:Google Cloud 项目 ID
  • REPOSITORY:您之前创建的 Artifact Registry 制品库的名称

Go

  1. 通过 gcloud builds submit 命令,结合使用 Dockerfile 和 Cloud Build 来构建 Docker 映像。此命令会构建文件并将其推送到 Artifact Registry 制品库。

    gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/dataflow/wordcount-go:latest .

    替换以下内容:

    • LOCATION:位置
    • PROJECT_ID:Google Cloud 项目 ID
    • REPOSITORY:您之前创建的 Artifact Registry 制品库的名称
  2. 使用 gcloud dataflow flex-template build 命令在 Cloud Storage 存储桶中创建名为 wordcount-go.json 的 Flex 模板。

    gcloud dataflow flex-template build gs://BUCKET_NAME/samples/dataflow/templates/wordcount-go.json \
      --image "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/dataflow/wordcount-go:latest" \
      --sdk-language "GO" \
      --metadata-file "metadata.json"

    BUCKET_NAME 替换为您之前创建的 Cloud Storage 存储桶的名称。

运行 Flex 模板

在此步骤中,您将使用该模板运行 Dataflow 作业。

Java

  1. 使用 gcloud dataflow flex-template run 命令运行使用 Flex 模板的 Dataflow 作业。

    gcloud dataflow flex-template run "getting-started-`date +%Y%m%d-%H%M%S`" \
     --template-file-gcs-location "gs://BUCKET_NAME/getting_started-java.json" \
     --parameters output="gs://BUCKET_NAME/output-" \
     --additional-user-labels "LABELS" \
     --region "REGION"

    替换以下内容:

    • BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
    • REGION:区域
    • LABELS:可选。附加到作业的标签,使用 <key1>=<val1>,<key2>=<val2>,... 格式
  2. 如需在 Google Cloud 控制台中查看 Dataflow 作业的状态,请进入 Dataflow 作业页面。

    打开“作业”

如果作业成功运行,则会将输出写入 Cloud Storage 存储桶中名为 gs://BUCKET_NAME/output--00000-of-00001.txt 的文件。

Python

  1. 使用 gcloud dataflow flex-template run 命令运行使用 Flex 模板的 Dataflow 作业。

    gcloud dataflow flex-template run "getting-started-`date +%Y%m%d-%H%M%S`" \
     --template-file-gcs-location "gs://BUCKET_NAME/getting_started-py.json" \
     --parameters output="gs://BUCKET_NAME/output-" \
     --additional-user-labels "LABELS" \
     --region "REGION"

    替换以下内容:

    • BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
    • REGION:区域
    • LABELS:可选。附加到作业的标签,使用 <key1>=<val1>,<key2>=<val2>,... 格式
  2. 如需在 Google Cloud 控制台中查看 Dataflow 作业的状态,请进入 Dataflow 作业页面。

    打开“作业”

如果作业成功运行,则会将输出写入 Cloud Storage 存储桶中名为 gs://BUCKET_NAME/output--00000-of-00001.txt 的文件。

Go

  1. 使用 gcloud dataflow flex-template run 命令运行使用 Flex 模板的 Dataflow 作业。

    gcloud dataflow flex-template run "wordcount-go-`date +%Y%m%d-%H%M%S`" \
     --template-file-gcs-location "gs://BUCKET_NAME/samples/dataflow/templates/wordcount-go.json" \
     --parameters output="gs://BUCKET_NAME/samples/dataflow/templates/counts.txt" \
     --additional-user-labels "LABELS" \
     --region "REGION"

    替换以下内容:

    • BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
    • REGION:区域
    • LABELS:可选。附加到作业的标签,使用 <key1>=<val1>,<key2>=<val2>,... 格式
  2. 如需在 Google Cloud 控制台中查看 Dataflow 作业的状态,请进入 Dataflow 作业页面。

    打开“作业”

如果作业成功运行,则会将输出写入 Cloud Storage 存储桶中名为 gs://BUCKET_NAME/samples/dataflow/templates/count.txt 的文件。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

删除各个资源

  1. 删除 Cloud Storage 存储桶以及存储桶中的所有对象。
    gcloud storage rm gs://BUCKET_NAME --recursive
  2. 删除 Artifact Registry 代码库。
    gcloud artifacts repositories delete REPOSITORY \
        --location=LOCATION
  3. 撤消您授予 Compute Engine 默认服务账号的角色。对以下每个 IAM 角色运行以下命令一次:
    • roles/dataflow.admin
    • roles/dataflow.worker
    • roles/storage.objectAdmin
    • roles/artifactregistry.writer
    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=SERVICE_ACCOUNT_ROLE
  4. Optional: Revoke the authentication credentials that you created, and delete the local credential file.

    gcloud auth application-default revoke
  5. Optional: Revoke credentials from the gcloud CLI.

    gcloud auth revoke

后续步骤