概览
Dataproc NodeGroup
资源是一组执行分配的角色的 Dataproc 集群节点。本页介绍了驱动程序节点组,这组 Compute Engine 虚拟机已分配 Driver
角色,目的是在 Dataproc 集群上运行作业驱动程序。
何时使用驱动程序节点组
- 只有在需要在共享集群上运行多个并发作业时,才应使用驱动程序节点组。
- 在使用驱动程序节点组之前,请增加主节点资源,以避免驱动程序节点组限制。
驱动程序节点如何帮助您运行并发作业
Dataproc 会为每个作业在 Dataproc 集群主服务器节点上启动作业驱动程序进程。驱动程序进程反过来会作为其子进程运行应用驱动程序(例如 spark-submit
)。不过,主实例上运行的并发作业数量受主实例节点上可用资源的限制。由于 Dataproc 主实例节点无法扩缩,因此当主实例节点资源不足以运行作业时,作业可能会失败或遭到节流。
驱动程序节点组是由 YARN 管理的特殊节点组,因此作业并发性不受主节点资源的限制。在包含驱动程序节点组的集群中,应用驱动程序在驱动程序节点上运行。如果驱动程序节点有足够的资源,则每个驱动程序节点都可以运行多个应用驱动程序。
优势
将 Dataproc 集群与驱动程序节点组搭配使用,您可以:
- 横向扩缩作业驱动程序资源,以运行更多并发作业
- 将驱动程序资源与工作器资源分开扩缩
- 在 Dataproc 2.0 及更高版本的映像集群上实现更快的缩减。在这些集群上,应用主运行在驱动程序节点组中的 Spark 驱动程序内(
spark.yarn.unmanagedAM.enabled
默认设置为true
)。 - 自定义驱动程序节点启动。您可以在初始化脚本中添加
{ROLE} == 'Driver'
,以便脚本在节点选择中为驱动程序节点组执行操作。
限制
- Dataproc 工作流模板不支持节点组。
- 无法停止、重启或自动扩缩节点组集群。
- MapReduce 应用主节点在工作器节点上运行。如果您启用平滑停用,工作器节点的缩减速度可能会很慢。
- 作业并发性受
dataproc:agent.process.threads.job.max
集群属性的影响。例如,如果有三个主副本,并且此属性设置为默认值100
,则集群级作业并发数量上限为300
。
与 Spark 集群模式相比的驱动程序节点组
功能 | Spark 集群模式 | 驱动程序节点组 |
---|---|---|
缩减工作器节点 | 长寿命驱动程序与短寿命容器在同一工作器节点上运行,这会导致使用优雅停用功能缩减工作器的速度变慢。 | 当驱动程序在节点组上运行时,工作器节点会更快地缩减。 |
流式驱动程序输出 | 需要在 YARN 日志中搜索以查找驱动程序被调度到的节点。 | 驱动程序输出会流式传输到 Cloud Storage,并在作业完成后显示在 Google Cloud 控制台中和 gcloud dataproc jobs wait 命令输出中。 |
驱动程序节点群组 IAM 权限
以下 IAM 权限与以下 Dataproc 节点组相关操作相关联。
权限 | 操作 |
---|---|
dataproc.nodeGroups.create
|
创建 Dataproc 节点组。如果用户在项目中拥有 dataproc.clusters.create ,则会被授予此权限。 |
dataproc.nodeGroups.get |
获取 Dataproc 节点组的详细信息。 |
dataproc.nodeGroups.update |
调整 Dataproc 节点组的大小。 |
驱动程序节点组操作
您可以使用 gcloud CLI 和 Dataproc API 创建、获取、调整大小、删除作业,以及将作业提交到 Dataproc 驱动程序节点组。
创建驱动程序节点组集群
一个驱动程序节点组与一个 Dataproc 集群相关联。您可以在创建 Dataproc 集群时创建节点组。您可以使用 gcloud CLI 或 Dataproc REST API 创建包含驱动程序节点组的 Dataproc 集群。
gcloud
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --driver-pool-size=SIZE \ --driver-pool-id=NODE_GROUP_ID
必需标志:
- CLUSTER_NAME:集群名称,在项目中必须是唯一的。名称必须以小写字母开头,最多可包含 51 个小写字母、数字和连字符。不得以连字符结尾。已删除的集群的名称可以重复使用。
- REGION:集群所在的区域。
- SIZE:节点组中的驱动程序节点数。所需的节点数量取决于作业负载和驱动程序池机器类型。最小驱动程序组节点的数量等于作业驱动程序所需的内存总量或 vCPU 数除以每个驱动程序池的机器内存或 vCPU 数。
- NODE_GROUP_ID:可选,但建议填写。该 ID 在集群中必须是唯一的。在后续操作(例如调整节点组大小)中,使用此 ID 来识别驱动程序组。如果未指定,Dataproc 会生成节点组 ID。
建议标志:
--enable-component-gateway
:添加此标志可启用 Dataproc 组件网关,以便访问 YARN 网页界面。YARN 界面中的“应用”和“调度程序”页面会显示集群和作业状态、应用队列内存、核心容量和其他指标。
其他标志:您可以将以下可选 driver-pool
标志添加到 gcloud dataproc clusters create
命令,以自定义节点组。
标志 | 默认值 |
---|---|
--driver-pool-id |
字符串标识符,如果未由标志设置,则由服务生成。在执行日后的节点池操作(例如调整节点组大小)时,可以使用此 ID 来识别节点组。 |
--driver-pool-machine-type |
n1-standard-4 |
--driver-pool-accelerator |
无默认值。指定加速器时,必须指定 GPU 类型;是否指定 GPU 的数量则取决于您的选择。 |
--num-driver-pool-local-ssds |
无默认取景方式 |
--driver-pool-local-ssd-interface |
无默认取景方式 |
--driver-pool-boot-disk-type |
pd-standard |
--driver-pool-boot-disk-size |
1000 GB |
--driver-pool-min-cpu-platform |
AUTOMATIC |
REST
在 Dataproc API cluster.create
请求中完成 AuxiliaryNodeGroup。
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:必填。Google Cloud 项目 ID。
- REGION:必填。Dataproc 集群区域。
- CLUSTER_NAME:必填。集群名称,该名称在项目中必须是唯一的。名称必须以小写字母开头,最多可包含 51 个小写字母、数字和连字符。不得以连字符结尾。已删除集群的名称可以重复使用。
- SIZE:必填。节点组中的节点数。
- NODE_GROUP_ID:可选,但建议填写。该 ID 在集群中必须是唯一的。在日后的操作(例如调整节点组大小)中,使用此 ID 来识别驱动程序组。如果未指定,Dataproc 会生成节点组 ID。
其他选项:请参阅 NodeGroup。
HTTP 方法和网址:
POST https://dataproc.googleapis.com/v1/projects/PROJECT_ID/regions/REGION/clusters
请求 JSON 正文:
{ "clusterName":"CLUSTER_NAME", "config": { "softwareConfig": { "imageVersion":"" }, "endpointConfig": { "enableHttpPortAccess": true }, "auxiliaryNodeGroups": [{ "nodeGroup":{ "roles":["DRIVER"], "nodeGroupConfig": { "numInstances": SIZE } }, "nodeGroupId": "NODE_GROUP_ID" }] } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { ... "auxiliaryNodeGroups": [ { "nodeGroup": { "name": "projects/PROJECT_ID/regions/REGION/clusters/CLUSTER_NAME/nodeGroups/NODE_GROUP_ID", "roles": [ "DRIVER" ], "nodeGroupConfig": { "numInstances": SIZE, "instanceNames": [ "CLUSTER_NAME-np-q1gp", "CLUSTER_NAME-np-xfc0" ], "imageUri": "https://www.googleapis.com/compute/v1/projects/cloud-dataproc-ci/global/images/dataproc-2-0-deb10-...-rc01", "machineTypeUri": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/REGION-a/machineTypes/n1-standard-4", "diskConfig": { "bootDiskSizeGb": 1000, "bootDiskType": "pd-standard" }, "managedGroupConfig": { "instanceTemplateName": "dataproc-2a8224d2-...", "instanceGroupManagerName": "dataproc-2a8224d2-..." }, "minCpuPlatform": "AUTOMATIC", "preemptibility": "NON_PREEMPTIBLE" } }, "nodeGroupId": "NODE_GROUP_ID" } ] }, }
获取驱动程序节点组集群元数据
您可以使用 gcloud dataproc node-groups describe 命令或 Dataproc API 获取驱动程序节点群元数据。
gcloud
gcloud dataproc node-groups describe NODE_GROUP_ID \ --cluster=CLUSTER_NAME \ --region=REGION
必要标志:
- NODE_GROUP_ID:您可以运行
gcloud dataproc clusters describe CLUSTER_NAME
来列出节点组 ID。 - CLUSTER_NAME:集群名称。
- REGION:集群区域。
REST
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:必填。Google Cloud 项目 ID。
- REGION:必填。集群区域。
- CLUSTER_NAME:必填。集群名称。
- NODE_GROUP_ID:必填。您可以运行
gcloud dataproc clusters describe CLUSTER_NAME
来列出节点组 ID。
HTTP 方法和网址:
GET https://dataproc.googleapis.com/v1/projects/PROJECT_ID/regions/REGION/clusters/CLUSTER_NAMEnodeGroups/Node_GROUP_ID
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_ID/regions/REGION/clusters/CLUSTER_NAME/nodeGroups/NODE_GROUP_ID", "roles": [ "DRIVER" ], "nodeGroupConfig": { "numInstances": 5, "imageUri": "https://www.googleapis.com/compute/v1/projects/cloud-dataproc-ci/global/images/dataproc-2-0-deb10-...-rc01", "machineTypeUri": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/REGION-a/machineTypes/n1-standard-4", "diskConfig": { "bootDiskSizeGb": 1000, "bootDiskType": "pd-standard" }, "managedGroupConfig": { "instanceTemplateName": "dataproc-driver-pool-mcia3j656h2fy", "instanceGroupManagerName": "dataproc-driver-pool-mcia3j656h2fy" }, "minCpuPlatform": "AUTOMATIC", "preemptibility": "NON_PREEMPTIBLE" } }
调整驱动程序节点组的大小
您可以使用 gcloud dataproc node-groups resize 命令或 Dataproc API 从集群主控节点组中添加或移除主控节点。
gcloud
gcloud dataproc node-groups resize NODE_GROUP_ID \ --cluster=CLUSTER_NAME \ --region=REGION \ --size=SIZE
必要标志:
- NODE_GROUP_ID:您可以运行
gcloud dataproc clusters describe CLUSTER_NAME
来列出节点组 ID。 - CLUSTER_NAME:集群名称。
- REGION:集群区域。
- SIZE:指定节点组中的新驱动程序节点数。
可选标志:
--graceful-decommission-timeout=TIMEOUT_DURATION
:缩减节点组时,您可以添加此标志以指定安全停用 TIMEOUT_DURATION,以避免立即终止作业驱动程序。建议:设置的超时时长至少应等于节点组上运行时间最长的作业的时长(不支持恢复失败的驱动程序)。
示例:gcloud CLI NodeGroup
扩容命令:
gcloud dataproc node-groups resize NODE_GROUP_ID \ --cluster=CLUSTER_NAME \ --region=REGION \ --size=4
示例:gcloud CLI NodeGroup
缩减命令:
gcloud dataproc node-groups resize NODE_GROUP_ID \ --cluster=CLUSTER_NAME \ --region=REGION \ --size=1 \ --graceful-decommission-timeout="100s"
REST
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:必填。Google Cloud 项目 ID。
- REGION:必填。集群区域。
- NODE_GROUP_ID:必填。您可以运行
gcloud dataproc clusters describe CLUSTER_NAME
来列出节点组 ID。 - SIZE:必填。节点组中的新节点数。
- TIMEOUT_DURATION:可选。缩减节点组时,您可以向请求正文添加
gracefulDecommissionTimeout
,以避免立即终止作业驱动程序。 建议:设置的超时时长至少应等于节点组上运行时间最长的作业的时长(不支持恢复失败的驱动程序)。示例:
{ "size": SIZE, "gracefulDecommissionTimeout": "TIMEOUT_DURATION" }
HTTP 方法和网址:
POST https://dataproc.googleapis.com/v1/projects/PROJECT_ID/regions/REGION/clusters/CLUSTER_NAME/nodeGroups/Node_GROUP_ID:resize
请求 JSON 正文:
{ "size": SIZE, }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_ID/regions/REGION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.dataproc.v1.NodeGroupOperationMetadata", "nodeGroupId": "NODE_GROUP_ID", "clusterUuid": "CLUSTER_UUID", "status": { "state": "PENDING", "innerState": "PENDING", "stateStartTime": "2022-12-01T23:34:53.064308Z" }, "operationType": "RESIZE", "description": "Scale "up or "down" a GCE node pool to SIZE nodes." } }
删除驱动程序节点组集群
当您删除 Dataproc 集群时,系统会删除与该集群关联的节点组。
提交作业
您可以使用 gcloud dataproc jobs submit 命令或 Dataproc API 将作业提交到具有驱动程序节点组的集群。
gcloud
gcloud dataproc jobs submit JOB_COMMAND \ --cluster=CLUSTER_NAME \ --region=REGION \ --driver-required-memory-mb=DRIVER_MEMORY \ --driver-required-vcores=DRIVER_VCORES \ DATAPROC_FLAGS \ -- JOB_ARGS
必要标志:
- JOB_COMMAND:指定作业命令。
- CLUSTER_NAME:集群名称。
- DRIVER_MEMORY:运行作业所需的作业驱动程序内存量(以 MB 为单位)(请参阅 Yarn 内存控制)。
- DRIVER_VCORES:运行作业所需的 vCPU 数量。
其他标志:
- DATAPROC_FLAGS:添加与作业类型相关的任何其他 gcloud dataproc jobs submit 标志。
- JOB_ARGS:添加任何参数(在
--
后面),以传递给作业。
示例:您可以在 Dataproc 驱动程序节点组集群上的 SSH 终端会话中运行以下示例。
用于估算
pi
值的 Spark 作业:gcloud dataproc jobs submit spark \ --cluster=CLUSTER_NAME \ --region=REGION \ --driver-required-memory-mb=2048 \ --driver-required-vcores=2 \ --class=org.apache.spark.examples.SparkPi \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ -- 1000
Spark wordcount 作业:
gcloud dataproc jobs submit spark \ --cluster=CLUSTER_NAME \ --region=REGION \ --driver-required-memory-mb=2048 \ --driver-required-vcores=2 \ --class=org.apache.spark.examples.JavaWordCount \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ -- 'gs://apache-beam-samples/shakespeare/macbeth.txt'
用于估算
pi
值的 PySpark 作业:gcloud dataproc jobs submit pyspark \ file:///usr/lib/spark/examples/src/main/python/pi.py \ --cluster=CLUSTER_NAME \ --region=REGION \ --driver-required-memory-mb=2048 \ --driver-required-vcores=2 \ -- 1000
Hadoop TeraGen MapReduce 作业:
gcloud dataproc jobs submit hadoop \ --cluster=CLUSTER_NAME \ --region=REGION \ --driver-required-memory-mb=2048 \ --driver-required-vcores=2 \ --jar file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \ -- teragen 1000 \ hdfs:///gen1/test
REST
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:必填。Google Cloud 项目 ID。
- REGION:必填。Dataproc 集群区域
- CLUSTER_NAME:必填。集群名称,该名称在项目中必须是唯一的。名称必须以小写字母开头,最多可包含 51 个小写字母、数字和连字符。不得以连字符结尾。已删除集群的名称可以重复使用。
- DRIVER_MEMORY:必填。运行作业所需的作业驱动程序内存量(以 MB 为单位)(请参阅 Yarn 内存控制)。
- DRIVER_VCORES:必填。运行作业所需的 vCPU 数量。
pi
值的 Spark 作业所需的字段)。
HTTP 方法和网址:
POST https://dataproc.googleapis.com/v1/projects/PROJECT_ID/regions/REGION/jobs:submit
请求 JSON 正文:
{ "job": { "placement": { "clusterName": "CLUSTER_NAME", }, "driverSchedulingConfig": { "memoryMb]": DRIVER_MEMORY, "vcores": DRIVER_VCORES }, "sparkJob": { "jarFileUris": "file:///usr/lib/spark/examples/jars/spark-examples.jar", "args": [ "10000" ], "mainClass": "org.apache.spark.examples.SparkPi" } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "reference": { "projectId": "PROJECT_ID", "jobId": "job-id" }, "placement": { "clusterName": "CLUSTER_NAME", "clusterUuid": "cluster-Uuid" }, "sparkJob": { "mainClass": "org.apache.spark.examples.SparkPi", "args": [ "1000" ], "jarFileUris": [ "file:///usr/lib/spark/examples/jars/spark-examples.jar" ] }, "status": { "state": "PENDING", "stateStartTime": "start-time" }, "jobUuid": "job-Uuid" }
查看作业日志
如需查看作业状态并帮助调试作业问题,您可以使用 gcloud CLI 或 Google Cloud 控制台查看驱动程序日志。
gcloud
在作业执行期间,作业驱动程序日志会流式传输到 gcloud CLI 输出或 Google Cloud 控制台。驱动程序日志会保留在 Cloud Storage 中的 Dataproc 集群暂存存储桶中。
运行以下 gcloud CLI 命令,列出 Cloud Storage 中驱动程序日志的位置:
gcloud dataproc jobs describe JOB_ID \ --region=REGION
驱动程序日志的 Cloud Storage 位置在命令输出中列为 driverOutputResourceUri
,格式如下:
driverOutputResourceUri: gs://CLUSTER_STAGING_BUCKET/google-cloud-dataproc-metainfo/CLUSTER_UUID/jobs/JOB_ID
控制台
如需查看节点组集群日志,请执行以下操作:
您可以使用以下 Logs Explorer 查询格式查找日志:
替换以下内容:resource.type="cloud_dataproc_cluster" resource.labels.project_id="PROJECT_ID" resource.labels.cluster_name="CLUSTER_NAME" log_name="projects/PROJECT_ID/logs/LOG_TYPE>"
- PROJECT_ID:Google Cloud 项目 ID。
- CLUSTER_NAME:集群名称。
- LOG_TYPE:
- Yarn 用户日志:
yarn-userlogs
- Yarn 资源管理器日志:
hadoop-yarn-resourcemanager
- Yarn 节点管理器日志:
hadoop-yarn-nodemanager
- Yarn 用户日志:
监控指标
Dataproc 节点组作业驱动程序在 dataproc-driverpool
分区下的 dataproc-driverpool-driver-queue
子队列中运行。
驱动程序节点组指标
下表列出了关联的节点组驱动程序指标,系统会默认为驱动程序节点组收集这些指标。
驱动程序节点组指标 | 说明 |
---|---|
yarn:ResourceManager:DriverPoolsQueueMetrics:AvailableMB |
dataproc-driverpool 分区下的 dataproc-driverpool-driver-queue 中可用内存量(以兆比字节为单位)。
|
yarn:ResourceManager:DriverPoolsQueueMetrics:PendingContainers |
dataproc-driverpool 分区下的 dataproc-driverpool-driver-queue 中待处理(已加入队列)的容器数量。 |
子队列指标
下表列出了子队列指标。系统会默认为主导节点组收集这些指标,并且可以为任何 Dataproc 集群启用这些指标的收集。
子队列指标 | 说明 |
---|---|
yarn:ResourceManager:ChildQueueMetrics:AvailableMB |
默认分区下此队列中的可用内存量(以兆比字节为单位)。 |
yarn:ResourceManager:ChildQueueMetrics:PendingContainers |
默认分区下此队列中待处理(已加入队列)的容器数量。 |
yarn:ResourceManager:ChildQueueMetrics:running_0 |
此队列中所有分区中运行时介于 0 到 60 分钟之间的作业数量。 |
yarn:ResourceManager:ChildQueueMetrics:running_60 |
此队列中所有分区中运行时介于 60 到 300 分钟之间的作业数量。 |
yarn:ResourceManager:ChildQueueMetrics:running_300 |
此队列中所有分区中运行时介于 300 到 1440 分钟之间的作业数量。 |
yarn:ResourceManager:ChildQueueMetrics:running_1440 |
此队列中所有分区中运行时长超过 1440 分钟的作业数量。 |
yarn:ResourceManager:ChildQueueMetrics:AppsSubmitted |
在所有分区中提交到此队列的应用数量。 |
如需在 Google Cloud 控制台中查看 YARN ChildQueueMetrics
和 DriverPoolsQueueMetrics
,请执行以下操作:
- 在 Metrics Explorer 中,依次选择 VM Instance → Custom 资源。
节点组作业驱动程序调试
本部分介绍了驱动程序节点组条件和错误,并提供了相应建议来解决这些条件或错误。
条件
情况:
yarn:ResourceManager:DriverPoolsQueueMetrics:AvailableMB
即将达到0
。这表示集群驱动程序池队列已耗尽内存。建议:扩大司机池的大小。
条件:
yarn:ResourceManager:DriverPoolsQueueMetrics:PendingContainers
大于 0。这可能表示集群驱动程序池队列内存不足,并且 YARN 正在将作业加入队列。建议:扩大司机池的大小。
错误
错误:
Cluster <var>CLUSTER_NAME</var> requires driver scheduling config to run SPARK job because it contains a node pool with role DRIVER. Positive values are required for all driver scheduling config values.
建议:使用正数设置
driver-required-memory-mb
和driver-required-vcores
。错误:
Container exited with a non-zero exit code 137
。建议:将
driver-required-memory-mb
增加到作业内存用量。