借助 Dataflow Flex 模板,您可以打包 Dataflow 流水线以进行部署。本教程介绍了如何构建 Dataflow Flex 模板,然后使用该模板运行 Dataflow 作业。
目标
- 构建 Dataflow Flex 模板。
- 使用该模板运行 Dataflow 作业。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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
-
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.
-
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_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.
- Replace
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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
-
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.
-
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_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.
- Replace
向您的 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
:您的项目 IDPROJECT_NUMBER
:您的项目编号SERVICE_ACCOUNT_ROLE
:每个角色
准备环境
安装 SDK 以及针对开发环境的任何要求。
Java
下载并安装 Java Development Kit (JDK) 版本 11。验证
JAVA_HOME
环境变量是否已设置并指向您的 JDK 安装。下载 Apache Maven,并按照适用于您的具体操作系统的 Maven 安装指南进行安装。
Python
Go
使用 Go 的下载和安装指南下载并安装适用于您的具体操作系统的 Go。如需了解 Apache Beam 支持的 Go 运行时环境,请参阅 Apache Beam 运行时支持。
下载代码示例。
Java
-
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
找到本教程的代码示例。
cd java-docs-samples/dataflow/flex-templates/getting_started
在 Uber JAR 文件中构建 Java 项目。
mvn clean package
此 Uber JAR 文件中嵌入了所有依赖项。您可以将此文件作为在其他库上没有外部依赖项的独立应用运行。
Python
-
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
找到本教程的代码示例。
cd python-docs-samples/dataflow/flex-templates/getting_started
Go
-
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
找到本教程的代码示例。
cd golang-samples/dataflow/flex-templates/wordcount
编译 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 制品库。
使用
gcloud artifacts repositories create
命令创建新的 Artifact Registry 制品库。gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=LOCATION
替换以下内容:
- REPOSITORY:代码库的名称。制品库名称对于项目中的每个制品库位置必须是唯一的。
- LOCATION:制品库的单区域或多区域位置。
使用
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 模板,Docker 映像会在您运行
gcloud dataflow flex-template build
命令时构建并推送到您的 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
通过
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 制品库的名称
使用
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
使用
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-" \ --region "REGION"
替换以下内容:
- BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
- REGION:区域
如需在 Google Cloud 控制台中查看 Dataflow 作业的状态,请进入 Dataflow 作业页面。
如果作业成功运行,则会将输出写入 Cloud Storage 存储桶中名为 gs://BUCKET_NAME/output--00000-of-00001.txt
的文件。
Python
使用
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-" \ --region "REGION"
替换以下内容:
- BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
- REGION:区域
如需在 Google Cloud 控制台中查看 Dataflow 作业的状态,请进入 Dataflow 作业页面。
如果作业成功运行,则会将输出写入 Cloud Storage 存储桶中名为 gs://BUCKET_NAME/output--00000-of-00001.txt
的文件。
Go
使用
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" \ --region "REGION"
替换以下内容:
- BUCKET_NAME:您之前创建的 Cloud Storage 存储桶的名称
- REGION:区域
如需在 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
删除各个资源
-
删除 Cloud Storage 存储桶以及存储桶中的所有对象。
gcloud storage rm gs://BUCKET_NAME --recursive
-
删除 Artifact Registry 代码库。
gcloud artifacts repositories delete REPOSITORY \ --location=LOCATION
-
撤消您授予 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
-
Optional: Revoke the authentication credentials that you created, and delete the local credential file.
gcloud auth application-default revoke
-
Optional: Revoke credentials from the gcloud CLI.
gcloud auth revoke
后续步骤
- 了解如何配置 Flex 模板。
- 参阅 Google 提供的模板列表。