概览
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
将 AuxiliaryNodeGroup 作为 Dataproc API cluster.create
请求的一部分完成。
在使用任何请求数据之前,请先进行以下替换:
- 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 redirect 命令或 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
Scale down 命令:
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 job 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 作业提交标志。
- 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
控制台
如需查看节点组集群日志,请执行以下操作:
您可以使用以下日志浏览器查询格式查找日志:
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-driver-queue 中 dataproc-driverpool 分区下的可用内存量(以 MiB 为单位)。
|
yarn:ResourceManager:DriverPoolsQueueMetrics:PendingContainers |
dataproc-driverpool 分区下 dataproc-driverpool-driver-queue 中待处理(已加入队列)的容器数量。 |
子队列指标
下表列出了子队列指标。默认情况下,系统会为驱动程序节点组收集这些指标;在任何 Dataproc 集群上,则可以启用这些指标以进行收集。
子队列指标 | 说明 |
---|---|
yarn:ResourceManager:ChildQueueMetrics:AvailableMB |
此队列中默认分区下的可用内存量(以 MB 为单位)。 |
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 中,选择虚拟机实例 → 自定义资源。
节点组作业驱动程序调试
本部分介绍了驱动程序节点组条件和错误,以及有关如何修正条件或错误的建议。
条件
条件:
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
以增加作业内存用量。