辅助工作器 - 抢占式虚拟机和非抢占式虚拟机

除了使用标准 Compute Engine 虚拟机作为 Dataproc 工作器(称为“主要”工作器)之外,Dataproc 集群还可以使用“辅助”工作器。

以下特征适用于 Dataproc 集群中的所有辅助工作器:

  • 仅处理 - 辅助工作器不存储数据,仅用来处理节点。因此,您可以使用辅助工作器来扩缩计算,而无需扩缩存储空间。

  • 无仅限辅助工作器集群 — 您的集群必须具有主要工作器。如果您创建集群,但未指定主要工作器的数量,则 Dataproc 会向该集群添加两个主要工作器。

  • 机器类型 - 辅助工作器使用集群的主要工作器的机器类型。例如,如果您创建的集群具有使用 n1-standard-4 机器类型的主要工作器,则添加到该集群的所有辅助工作器也将使用 n1-standard-4 机器。

  • 永久性磁盘大小 - 默认情况下,使用 100GB 或主要工作器启动磁盘大小中较小的值来创建辅助工作器。此磁盘空间用于数据的本地缓存,但无法通过 HDFS 访问。 您可以在创建集群时使用 gcloud dataproc clusters create --secondary-worker-boot-disk-size 命令替换默认磁盘大小。即使集群在创建时没有辅助工作器,您也可以指定此标志。

  • 异步创建 - 如果通过创建集群或纵向扩容集群来添加辅助工作器,则在创建或更新操作完成时可能无法预配辅助工作器。这是因为 Dataproc 使用代管式实例组 (MIG) 来管理辅助工作器,这些工作器会在能够预配虚拟机时立即异步创建它们(请参阅检查代管式实例的状态)。

抢占式和非抢占式辅助工作器

辅助工作器有两种类型:抢占式和非抢占式。集群中的所有辅助工作器必须是同一类型:抢占式或非抢占式。默认为抢占式。

  • 抢占式辅助工作器:抢占式工作器是默认的辅助工作器类型。如果 Google Cloud 要求将抢占式工作器从其他集群中移除以用于其他任务,则系统会回收这些工作器。虽然移除抢占式工作器可能会影响作业稳定性,但您可以决定使用抢占式实例来降低非关键数据处理的每小时计算费用,或以较低的总费用创建非常大型的集群(您可以使用 Google Cloud 价格计算器来估算费用)。

    • 为获得最佳结果,集群中的抢占式工作器数量应小于集群中所有工作器(主要工作器和所有辅助工作器)总数的 50%。

    • 使用抢占式工作器时,与在非抢占式工作器上运行的作业相比,您的作业可能会遇到更多的暂时性单工作器任务失败。如需提高作业对低层级任务失败的容忍度,您可以设置与用于自动扩缩集群的默认属性值类似的集群属性值,以增加任务重试次数上限并帮助避免作业失败。

  • 非抢占式辅助工作器:您可以创建包含非抢占式辅助工作器的集群,从而在不满足作业稳定性的前提下扩缩计算。您必须指定“非抢占式”工作器类型(默认为“抢占式”)。

使用辅助工作器

在通过 Dataproc API、使用 Cloud SDK gcloud 命令行工具或通过 Google Cloud Console 创建集群时,请指定辅助工作器的数量和类型(抢占式或非抢占式)。

  • 集群可以包含抢占式辅助工作器或非抢占式辅助工作器,但不能同时包含这两者。
  • 您可以在创建集群后更新集群,以更改集群中辅助工作器的数量,但不能更改其类型。
  • 标签更新会在 24 小时内传播到所有抢占式辅助工作器。目前,标签更新不会传播到现有非抢占式辅助工作器。标签更新会传播到标签更新添加到集群的所有工作器。例如,如果您纵向扩容集群,则所有新的主要工作器和辅助工作器都将具有新标签。

gcloud 命令

创建集群后,使用 gcloud dataproc clusters create 命令将辅助工作器添加到集群中。创建集群后,您可以使用 gcloud dataproc clusters update 命令在集群中添加或移除辅助工作器(可以更新辅助工作器的数量,但不能更新其类型)。

创建一个包含辅助工作器的集群

如需创建一个包含辅助工作器的集群,请使用带有 --num-secondary-workers 参数的 gcloud dataproc clusters create 命令。请注意,辅助工作器默认为抢占式工作器,但您可以在创建集群时通过设置 --secondary-worker-type=non-preemptible 来添加非抢占式辅助工作器(请参阅示例 2)。

示例 1

以下命令创建了一个名为“my-test-cluster”的集群,其中包含两个抢占式工作器。

gcloud dataproc clusters create my-test-cluster \
    --num-secondary-workers=2 \
    --region=us-central1

示例 2

以下命令使用 secondary-worker-type 标志创建“my-test-cluster”集群,其中包含两个非抢占式辅助工作器。

gcloud dataproc clusters create my-test-cluster \
    --num-secondary-workers=2 \
    --secondary-worker-type=non-preemptible \
    --region=us-central1

更新集群以添加或移除辅助工作器

如需更新集群以添加或移除辅助工作器,请使用带有 --num-secondary-workers 参数的 gcloud dataproc clusters update 命令。

示例

以下命令会将名为“my-test-cluster”的集群更新为使用两个辅助工作器。

gcloud dataproc clusters update my-test-cluster \
    --num-secondary-workers=2 \
    --region=us-central1

从集群中移除所有辅助工作器

如需从集群中移除所有辅助工作器,请使用带有 --num-secondary-workers(设为 0)的 gcloud dataproc clusters update 命令。

示例

以下命令会从集群中移除所有辅助工作器。

gcloud dataproc clusters update my-test-cluster \
    --num-secondary-workers=0 \
    --region=us-central1

REST API

创建一个包含辅助工作器的集群

创建集群时,使用 Dataproc clusters.create API 将辅助工作器添加至集群中。请注意,辅助工作器默认为抢占式工作器,但您可以向集群添加非抢占式辅助工作器,如示例 2 所示。

示例 1

以下 POST 请求会创建一个包含两个抢占式工作器的集群。


POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/clusters

{
  "clusterName": "cluster-name",
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 2
    }
  }
}

示例 2

以下 POST 请求将创建一个集群,其中包含两个非抢占式辅助工作器。


POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/clusters

{
  "clusterName": "cluster-name",
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 2,
      "preemptibility": "NON_PREEMPTIBLE"
    }
  }
}

更新集群以添加或移除辅助工作器

使用 Dataproc clusters.patch API 添加和移除辅助工作器。

示例

以下 PATCH 请求会将集群更新为具有 2 个辅助工作器。


PATCH /v1/projects/project-id/regions/region/clusters/cluster-name?updateMask=config.secondary_worker_config.num_instances
{
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 2
    }
  }
}

控制台

通过 Cloud Console 创建 Dataproc 集群时,您可以指定辅助工作器的数量。创建集群后,您可以通过 Cloud Console 修改集群配置来添加和移除辅助工作器。

创建一个包含辅助工作器的集群

在 Cloud Console 的创建集群页面上,您可以从 Dataproc 上的“配置节点”面板的“辅助工作器节点数”部分,设置要应用于新集群的辅助工作器的数量和类型。在“辅助工作器节点数”和“抢占式”字段中分别指定辅助工作器的数量和类型。

更新集群中的辅助实例

要更新集群中的辅助工作器数量,请点击 Cloud Console 的集群页面上的集群名称。在集群详情页面上,执行以下操作。点击“配置”标签页,然后点击“修改”并更新“辅助工作器节点数”字段中的数目。

从集群中移除所有辅助实例

如需从集群中移除所有辅助实例,请按照上述说明更新集群配置,并在辅助工作器节点数字段中指定 0

排查辅助工作器问题

服务帐号权限问题:辅助工作器通过代管式实例组创建;Compute Engine 使用您的项目的 Google API 服务代理服务帐号执行代管式实例组操作。此服务帐号名称的格式如下:project-id@cloudservices.gserviceaccount.com

如果此服务帐号存在权限问题,Dataproc 日志将不会报告创建辅助工作器的失败情况,但失败的工作器将在 Google Cloud Console 的集群详情页面的“虚拟机实例”标签页下列出,并且不会显示绿色对勾标记(打开 Dataproc 集群页面,然后点击集群名称以打开集群的集群详情页面)。

  • 代管式实例组权限问题:如需检查代管式实例组权限是否存在问题,请在日志浏览器中查看“Google Compute Engine 实例组”资源类型的日志,并过滤相应的实例组 ID。实例组 ID 过滤条件将以 dataproc-CLUSTER NAME-sw 格式显示实例组名称,并且实例组 ID 将在日志记录查询中自动填充。除了使用下拉菜单中的过滤条件以外,您还可以为 resource.type="gce_instance_group"resource.labels.instance_group_name="dataproc-CLUSTER NAME-sw" 应用日志记录过滤条件。

  • 自定义映像权限问题:如果 Dataproc 集群虚拟机在创建时使用了从另一个项目提取的自定义映像,则 Compute Image User 角色必须分配给项目的 project-id@cloudservices.gserviceaccount.com 服务帐号(请参阅向代管式实例组授予对映像的访问权限)。如果未分配正确的角色,此错误消息将显示在日志中:Required 'compute.images.useReadOnly' permission for 'projects/[IMAGE PROJECT]/global/images/[IMAGE NAME]