Dataproc 驱动程序节点组

概览

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

控制台

如需查看节点组集群日志,请执行以下操作:

  1. 启用日志记录

  2. 您可以使用以下 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

监控指标

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 此队列中所有分区中运行时介于 060 分钟之间的作业数量。
yarn:ResourceManager:ChildQueueMetrics:running_60 此队列中所有分区中运行时介于 60300 分钟之间的作业数量。
yarn:ResourceManager:ChildQueueMetrics:running_300 此队列中所有分区中运行时介于 3001440 分钟之间的作业数量。
yarn:ResourceManager:ChildQueueMetrics:running_1440 此队列中所有分区中运行时长超过 1440 分钟的作业数量。
yarn:ResourceManager:ChildQueueMetrics:AppsSubmitted 在所有分区中提交到此队列的应用数量。

如需在 Google Cloud 控制台中查看 YARN ChildQueueMetricsDriverPoolsQueueMetrics,请执行以下操作:

节点组作业驱动程序调试

本部分介绍了驱动程序节点组条件和错误,并提供了相应建议来解决这些条件或错误。

条件

  • 情况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-mbdriver-required-vcores

  • 错误Container exited with a non-zero exit code 137

    建议:将 driver-required-memory-mb 增加到作业内存用量。