本文档介绍如何在运行 Dataflow 作业时指定网络和/或子网选项。
若要按照这些步骤操作,您需要了解如何创建 Google Cloud 网络和子网。您还需要熟悉下一部分中介绍的网络术语。
default
网络配置为允许运行 Dataflow 作业,但其他服务也可能会使用此网络。请确保对 default
网络的任何更改与所有服务兼容。或者,您也可以为 Dataflow 创建单独的网络。
如需详细了解如何排查网络问题,请参阅排查 Dataflow 网络问题。
Google Cloud 网络术语
VPC 网络。VPC 网络是物理网络的虚拟版本,在 Google 的生产网络内实现。VPC 有时称为“网络”,可为项目中的资源提供连接。
如需详细了解 VPC,请参阅 VPC 网络。
共享 VPC 网络。在使用共享 VPC 时,您将项目指定为宿主项目,并将一个或多个其他服务项目连接到该项目。宿主项目中的 VPC 网络称为“共享 VPC 网络”。如果 Shared VPC Admin 将您定义为 Service Project Admin,则您有权在宿主项目的网络中至少使用部分子网。
如需详细了解共享 VPC,请参阅共享 VPC。
VPC Service Controls。 Dataflow VPC Service Controls 有助于防止外部实体或内部实体的意外或针对性操作,从而有助于最大限度地减少数据渗漏的风险。您可以使用 VPC Service Controls 创建边界,该边界可保护您明确指定的服务的资源和数据。
如需详细了解 VPC Service Controls,请参阅 VPC Service Controls 概览。如需了解将 Dataflow 与 VPC Service Controls 结合使用的限制,请参阅支持的产品和限制。
防火墙规则。使用防火墙规则允许或拒绝传入和传出虚拟机的流量。如需了解详情,请参阅配置互联网访问权限和防火墙规则。
Dataflow 作业的网络和子网
创建 Dataflow 作业时,您可以指定网络和/或子网选项。
请考虑以下准则:
如果您不确定要使用哪个参数,请仅指定子网参数。然后,系统会隐式为您指定网络参数。
如果同时省略子网和网络参数,Google Cloud 会假定您打算使用名为
default
的自动模式 VPC 网络。 如果您的项目中没有名为default
的网络,则必须指定备用网络或子网。
指定网络参数的准则
如需在项目中选择自动模式 VPC 网络,请使用网络参数。如需了解详情,请参阅创建自动模式 VPC 网络。
您只能使用网络名称来指定网络,而不能通过完整的网址来指定网络。
如果同时满足以下两个条件,您只能使用网络参数选择共享 VPC 网络:
您选择的共享 VPC 网络是自动模式 VPC 网络。
您是 Service Project Admin,对整个共享 VPC 宿主项目具有项目级权限。共享 VPC 管理员已授予您整个宿主项目的 Compute Network User 角色,因此您可以使用其所有网络和子网。
对于所有其他情况,您必须指定子网。
指定子网参数的准则
如果指定子网,则 Dataflow 会为您选择网络。因此,在指定子网时可以省略网络参数。
如需在网络中选择特定子网,请使用子网参数。
使用完整网址或缩写路径指定子网。如果子网位于共享 VPC 网络中,则必须使用完整的网址。
您必须选择与运行 Dataflow 工作器的可用区位于同一区域的子网。
在以下情况下,您必须指定子网参数:
您指定的子网位于自定义模式 VPC 网络中。
您是服务项目管理员,具有对共享 VPC 宿主项目中特定子网的子网级权限。
子网大小会根据可用 IP 地址数量限制实例数。此大小不会影响 Dataflow VPC Service Controls 的性能。
为共享 VPC 指定子网参数的准则
为共享 VPC 指定子网网址时,请确保 HOST_PROJECT_ID 是在其中托管 VPC 的项目。
如果子网位于共享 VPC 网络中,则必须使用完整的网址。请参阅指定子网的完整网址示例。
确保共享 VPC 子网与 Dataflow 服务账号共享,并且在指定子网上分配了 Compute Network User 角色。必须向宿主项目中的 Dataflow 服务账号分配 Compute Network User 角色。
在 Google Cloud 控制台中,进入共享 VPC 页面。
选择宿主项目。
在单独子网访问权限部分中,选择您的子网。子网级权限窗格会显示此子网的权限。您可以查看 VPC 子网是否已分配 Compute Network User 角色。
如需授予权限,请在子网级权限窗格中点击添加主账号。
如果网络未共享,当您尝试运行作业时,系统会显示以下错误消息:
Error: Message: Required 'compute.subnetworks.get' permission
。如需了解详情,请参阅“排查 Dataflow 权限问题”中的所需的“compute.subnetworks.get”权限。
网络和子网规范示例
以下示例展示了指定子网的完整网址:
https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION_NAME/subnetworks/SUBNETWORK_NAME
替换以下内容:
HOST_PROJECT_ID
:宿主项目 IDREGION_NAME
:您的 Dataflow 作业的区域SUBNETWORK_NAME
:您的 Compute Engine 子网的名称
以下是一个示例网址,其中宿主项目 ID 为 my-cloud-project
,区域为 us-central1
,子网名称为 mysubnetwork
:
https://www.googleapis.com/compute/v1/projects/my-cloud-project/regions/us-central1/subnetworks/mysubnetwork
以下是指定子网的简写形式示例:
regions/REGION_NAME/subnetworks/SUBNETWORK_NAME
替换以下内容:
REGION_NAME
:您的 Dataflow 作业的区域SUBNETWORK_NAME
:您的 Compute Engine 子网的名称
使用指定的网络运行流水线
如果您要使用 Google Cloud 创建的默认网络以外的网络,则在大多数情况下,您需要指定子网。系统会根据您指定的子网自动推断网络。如需了解详情,请参阅本文档中的指定网络参数的指南。
以下示例展示了如何从命令行或使用 REST API 运行流水线。此示例指定了一个网络。
Java
mvn compile exec:java \ -Dexec.mainClass=INPUT_PATH \ -Dexec.args="--project=HOST_PROJECT_ID \ --stagingLocation=gs://STORAGE_BUCKET/staging/ \ --output=gs://STORAGE_BUCKET/output \ --region=REGION \ --runner=DataflowRunner \ --network=NETWORK_NAME"
Python
python -m INPUT_PATH \ --project HOST_PROJECT_ID \ --region=REGION \ --runner DataflowRunner \ --staging_location gs://STORAGE_BUCKET/staging \ --temp_location gs://STORAGE_BUCKET/temp \ --output gs://STORAGE_BUCKET/output \ --network NETWORK_NAME
Go
wordcount --project HOST_PROJECT_ID \ --region HOST_GCP_REGION \ --runner dataflow \ --staging_location gs://STORAGE_BUCKET/staging \ --temp_location gs://STORAGE_BUCKET/temp \ --input INPUT_PATH \ --output gs://STORAGE_BUCKET/output \ --network NETWORK_NAME
API
如果您使用 REST API 运行 Dataflow 模板,请将 network
和/或 subnetwork
添加到 environment
对象。
POST https://dataflow.googleapis.com/v1b3/projects/[YOUR_PROJECT_ID]/templates:launch?gcsPath=gs://dataflow-templates/wordcount/template_file
{
"jobName": "JOB_NAME",
"parameters": {
"inputFile" : "INPUT_PATH",
"output": "gs://STORAGE_BUCKET/output"
},
"environment": {
"tempLocation": "gs://STORAGE_BUCKET/temp",
"network": "NETWORK_NAME",
"zone": "us-central1-f"
}
}
请替换以下内容:
JOB_NAME
:您的 Dataflow 作业的名称(仅限 API)INPUT_PATH
:来源的路径HOST_PROJECT_ID
:宿主项目 IDREGION
:Dataflow 区域,例如us-central1
STORAGE_BUCKET
:存储桶NETWORK_NAME
:您的 Compute Engine 网络的名称
使用指定的子网运行流水线
如果您是服务项目管理员并且仅有权使用共享 VPC 网络中的特定子网,则必须使用您有权使用的子网指定 subnetwork
参数。
以下示例展示了如何从命令行或使用 REST API 运行流水线。该示例指定了子网。您还可以指定网络。
Java
mvn compile exec:java \ -Dexec.mainClass=INPUT_PATH \ -Dexec.args="--project=HOST_PROJECT_ID \ --stagingLocation=gs://STORAGE_BUCKET/staging/ \ --output=gs://STORAGE_BUCKET/output \ --region=REGION \ --runner=DataflowRunner \ --subnetwork=https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME"
Python
python -m INPUT_PATH \ --project HOST_PROJECT_ID \ --region=REGION \ --runner DataflowRunner \ --staging_location gs://STORAGE_BUCKET/staging \ --temp_location gs://STORAGE_BUCKET/temp \ --output gs://STORAGE_BUCKET/output \ --subnetwork https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME
Go
wordcount --project HOST_PROJECT_ID \ --region HOST_GCP_REGION \ --runner dataflow \ --staging_location gs://STORAGE_BUCKET/staging \ --temp_location gs://STORAGE_BUCKET/temp \ --input INPUT_PATH \ --output gs://STORAGE_BUCKET/output \ --subnetwork https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME
API
如果您使用 REST API 运行 Dataflow 模板,请将 network
和/或 subnetwork
添加到 environment
对象。
POST https://dataflow.googleapis.com/v1b3/projects/[YOUR_PROJECT_ID]/templates:launch?gcsPath=gs://dataflow-templates/wordcount/template_file
{
"jobName": "JOB_NAME",
"parameters": {
"inputFile" : "INPUT_PATH",
"output": "gs://STORAGE_BUCKET/output"
},
"environment": {
"tempLocation": "gs://STORAGE_BUCKET/temp",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME",
"zone": "us-central1-f"
}
}
替换以下内容:
JOB_NAME
:您的 Dataflow 作业的名称(仅限 API)INPUT_PATH
:来源的路径HOST_PROJECT_ID
:宿主项目 IDREGION
:Dataflow 区域,例如us-central1
STORAGE_BUCKET
:存储桶SUBNETWORK_NAME
:您的 Compute Engine 子网的名称
关闭外部 IP 地址
如需关闭外部 IP 地址,请参阅配置互联网访问权限和防火墙规则。