除了将标准 Compute Engine 虚拟机用作 Dataproc 工作器(称为“主要”工作器)之外,Dataproc 集群还可以使用 secondary
工作器。
以下特征适用于 Dataproc 集群中的所有辅助工作器:
仅处理 - 辅助工作器不存储数据,仅用来处理节点。因此,您可以使用辅助工作器来扩缩计算,而无需扩缩存储空间。
无仅限辅助工作器集群 — 您的集群必须具有主要工作器。如果您创建集群,但未指定主要工作器的数量,则 Dataproc 会向该集群添加两个主要工作器。
机器类型 - 默认情况下,辅助工作器使用集群主要工作器的机器类型。例如,如果您创建的集群具有使用
n1-standard-4
机器类型的主要工作器,则添加到该集群的所有辅助工作器也将使用n1-standard-4
机器。您可以为辅助工作器指定一个或多个按顺序排名的机器类型列表,而不是为辅助工作器使用默认的主要工作器机器类型。如需了解详情,请参阅 Dataproc 灵活虚拟机。
永久性磁盘大小 - 默认情况下,使用 100GB 或主要工作器启动磁盘大小中较小的值来创建辅助工作器。此磁盘空间用于数据的本地缓存,但无法通过 HDFS 访问。 您可以在创建集群时使用
gcloud dataproc clusters create --secondary-worker-boot-disk-size
命令替换默认磁盘大小。即使创建集群时没有辅助工作器,您也可以指定此标志。异步创建 - 通过创建或扩容集群来添加辅助工作器时,辅助工作器可能无法在创建或更新操作完成时进行预配。这是因为 Dataproc 使用代管式实例组 (MIGs) 管理辅助工作器,MIG 会在预配虚拟机后立即异步创建虚拟机(请参阅检查托管实例的状态)。
抢占式和非抢占式辅助工作器
辅助工作器有三种类型:Spot 虚拟机、标准抢占式虚拟机和非抢占式虚拟机。如果为集群指定辅助工作器,它们的类型必须相同。默认的 Dataproc 辅助工作器类型是标准抢占式虚拟机。
示例:如果在创建集群时选择三个辅助工作器,则可以指定全部三个辅助工作器均为 Spot 虚拟机,或者全部三个为(标准)抢占式虚拟机,或全部三个均为非抢占式虚拟机,但无法指定每个工作器的类型。
Spot 虚拟机是最新类型的 Compute Engine 抢占式虚拟机。它具有标准抢占式虚拟机费用较低的价格模式,但与最长生命周期为 24 小时的标准抢占式虚拟机不同,Spot 虚拟机没有最长生命周期。如果 Google Cloud 需要 Spot 和标准抢占式虚拟机工作器执行其他任务,则系统会收回这些工作器并从 Dataproc 集群中移除这些工作器。
抢占式工作器
虽然移除抢占式工作器可能会影响作业稳定性,但您可以决定使用抢占式实例来降低非关键数据处理的每小时计算费用,或者以较低的总费用创建大型集群(您可以使用 Google Cloud 价格计算器来估算费用)。
为获得最佳结果,集群中的抢占式工作器数量应少于集群中所有工作器总数(主要工作器和所有辅助工作器)总数的 50%。
使用抢占式工作器时,与在非抢占式工作器上运行的作业相比,您的作业最有可能遇到更多数量的暂时性单工作器任务失败。如需提高作业对低级别任务故障的容忍度,您可以设置与用于自动扩缩集群的默认属性值类似的集群属性值,以提高任务重试次数上限并帮助避免作业失败。
节省费用的注意事项:使用抢占式虚拟机并不一定能够节省费用,因为抢占可能会导致作业执行时间延长,从而导致作业费用增加。虽然将增强型灵活模式 (EFM) 与抢占式虚拟机搭配使用有助于缓解此结果,但抢占式虚拟机的总体费用节省将因用例而异。通常,短期作业更适合使用抢占式虚拟机,因为作业执行期间抢占的概率较低。尝试使用不同的作业选项(例如不使用抢占式虚拟机和具有 EFM 的抢占式虚拟机)来估算费用并找到最佳解决方案。
非抢占式工作器
- 您可以创建具有非抢占式辅助工作器的集群,以便在不影响作业稳定性的情况下扩缩计算能力。为此,请将“非抢占式”指定为辅助工作器类型。
使用辅助工作器
使用 Google Cloud 控制台、gcloud CLI 或 Dataproc API 创建集群时,您可以指定辅助工作器的数量和类型。
- 辅助工作器的类型必须相同。
- 您可以在创建集群后更新集群,以更改集群中辅助工作器的数量,但不能更改其类型。
- 标签更新会在 24 小时内传播到所有抢占式辅助工作器。标签更新不会传播到现有的非抢占式辅助工作器。标签更新会传播到标签更新后添加到集群的所有工作器。例如,如果您纵向扩容集群,则所有新的主要工作器和辅助工作器都将具有新标签。
控制台
从 Google Cloud 控制台创建 Dataproc 集群时,您可以指定辅助工作器的数量。创建集群后,您可以通过在 Google Cloud 控制台中修改集群配置来添加和移除辅助工作器。
创建一个包含辅助工作器的集群
您可以在 Google Cloud 控制台的 Dataproc 创建集群页面上的“配置节点”面板的“辅助工作器节点”部分中设置要应用于新集群的辅助工作器的数量和类型。请在辅助工作器节点和可抢占性字段中分别指定辅助工作器的数量和类型。
更新集群中的辅助实例
如需更新集群中的辅助工作器数量,请在 Google Cloud 控制台的集群页面上点击集群的名称。在集群详情页面上,执行以下操作。点击“配置”标签页,然后点击“修改”并更新“辅助工作器节点数”字段中的数目。
从集群中移除所有辅助实例
如需从集群中移除所有辅助工作器,请按照前文所述更新集群配置,在辅助工作器节点字段中指定 0
。
gcloud 命令
创建集群时,使用 gcloud dataproc clusters create
命令将辅助工作器添加到集群中。创建集群后,您可以使用 gcloud dataproc clusters update
命令在集群中添加或移除辅助工作器(可以更新辅助工作器的数量,但无法更新其类型)。
创建一个包含辅助工作器的集群
如需创建具有辅助工作器的集群,请使用带有 --num-secondary-workers
参数的 gcloud dataproc clusters create
命令。请注意,默认情况下辅助工作器是标准的抢占式虚拟机。您可以在创建集群时设置 --secondary-worker-type=non-preemptible
(dataproc:secondary-workers.is-preemptible.override
属性不再用于指定辅助工作器的类型),以指定非抢占式辅助工作器。
以下命令可创建带有两个标准抢占式(默认类型)辅助工作器的“cluster1”。
gcloud dataproc clusters create cluster1 \ --num-secondary-workers=2 \ --region=us-central1
以下命令使用 secondary-worker-type
标志创建具有两个 Spot(抢占式)辅助工作器的“cluster2”。
gcloud dataproc clusters create cluster2 \ --num-secondary-workers=2 \ --secondary-worker-type=spot \ --region=us-central1
示例 3
以下命令使用 secondary-worker-type
标志创建具有两个非抢占式辅助工作器的“cluster3”。
gcloud dataproc clusters create cluster3 \ --num-secondary-workers=2 \ --secondary-worker-type=non-preemptible \ --region=us-central1
更新集群以添加或移除辅助工作器
如需更新集群以添加或移除辅助工作器,请使用带有 --num-secondary-workers
参数的 gcloud dataproc clusters update
命令。
以下命令会将“example-cluster”更新为使用四个辅助工作器(其具有创建集群时指定的默认类型或类型)。
gcloud dataproc clusters update example-cluster \ --num-secondary-workers=4 \ --region=us-central1
从集群中移除所有辅助工作器
如需从集群中移除所有辅助工作器,请使用 gcloud dataproc clusters update
命令,并将 --num-secondary-workers
设置为 0
。
以下命令会从“example-cluster”中移除所有辅助工作器。
gcloud dataproc clusters update example-cluster \ --num-secondary-workers=0 \ --region=us-central1
REST API
创建一个包含辅助工作器的集群
创建集群时,使用 Dataproc clusters.create API 将辅助工作器添加至集群中。请注意,默认情况下辅助工作器是标准的抢占式虚拟机。
示例 1以下 POST 请求会创建一个具有两个标准抢占式(默认类型)虚拟机工作器的“cluster1”。
POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/clusters { "clusterName": "cluster1", "config": { "secondaryWorkerConfig": { "numInstances": 2 } } }
以下 POST 请求将创建一个具有两个 Spot(抢占式)虚拟机工作器的“cluster2”。
POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/clusters { "clusterName": "cluster2", "config": { "secondaryWorkerConfig": { "numInstances": 2, "preemptibility": "SPOT" } } }
示例 3
以下 POST 请求使用两个非抢占式辅助工作器创建“cluster3”。
POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/clusters { "clusterName": "cluster3", "config": { "secondaryWorkerConfig": { "numInstances": 2, "preemptibility": "NON_PREEMPTIBLE" } } }
更新集群以添加或移除辅助工作器
使用 Dataproc clusters.patch API 添加和移除辅助工作器。
示例以下 PATCH 请求会将集群更新为具有四个辅助工作器(具有创建集群时指定的默认类型或类型)。
PATCH /v1/projects/project-id/regions/region/clusters/cluster-name?updateMask=config.secondary_worker_config.num_instances { "config": { "secondaryWorkerConfig": { "numInstances": 4 } } }
排查辅助工作器问题
服务账号权限问题:辅助工作器通过代管式实例组创建;Compute Engine 使用您的项目的 Google API 服务代理服务账号执行代管式实例组操作。此服务账号名称的格式如下:project-id@cloudservices.gserviceaccount.com
。
如果此服务帐号存在权限问题,Dataproc 日志不会报告创建辅助工作器的失败情况,但失败的工作器将列在 Google Cloud 控制台的集群详情页面的“虚拟机实例”标签页下,而不会显示绿色对勾标记(打开 Dataproc 集群页面,然后点击集群名称以打开集群的集群详情页面)。
代管实例组权限问题:如需检查代管实例组权限是否存在问题,请查看日志浏览器中“Google Compute Engine Instance Group”资源类型”的日志,并过滤相应的实例组 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]