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

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

控制台

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

  1. 启用 Logging

  2. 您可以使用以下日志浏览器查询格式查找日志:

    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-driver-queuedataproc-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 此队列中所有分区下运行时介于 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 以增加作业内存用量。