创建 Dataproc 集群时,您可以在可执行文件或脚本(Dataproc 会在 Dataproc 集群设置完成后立即在集群中的所有节点上运行这些可执行文件或脚本)中指定初始化操作。初始化操作通常会设置作业依赖关系组件(比如安装 Python 软件包),以便作业可以提交到集群,而无需在作业运行时安装依赖关系组件。
您可以在以下位置找到初始化操作脚本示例: 注意:Google 不支持这些示例。
- GitHub 代码库
- Cloud Storage - 位于区域存储分区
gs://goog-dataproc-initialization-actions-REGION
的公共存储分区中
重要注意事项和指南
请勿创建引用位于公共存储分区
gs://goog-dataproc-initialization-actions-REGION
中的初始化操作的生产集群。这些脚本仅供参考实现之用。这些脚本会与不断进行的 GitHub 代码库更改同步,对这些脚本进行更新可能会破坏您的集群创建。而是应该如下示例所示那样,将初始化操作从公共存储桶复制到版本化 Cloud Storage 存储桶文件夹中: 然后,通过引用 Cloud Storage 中的副本来创建集群:REGION=COMPUTE_REGION
gcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \ gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh
gcloud dataproc clusters create CLUSTER_NAME \ --region=${REGION} \ --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \ ...other flags...
更新初始化操作时(例如,将 Cloud Storage 初始化操作与对公共存储桶或 GitHub 代码库初始化操作所做的更改同步),请创建一个新文件夹(最好使用版本名称)来接收更新后的初始化操作。相反,如果您就地更新初始化操作,则新节点(例如由自动扩缩器添加的节点)将运行就地更新后的初始化操作,而不是在现有节点上运行的旧版初始化操作。此类初始化操作差异可能会导致集群节点不一致或损坏。
初始化操作以
root
用户身份运行。您无需使用sudo
。在初始化操作中使用绝对路径。
在初始化操作中使用 shebang 行来指明脚本的解析方式(例如
#!/bin/bash
或#!/usr/bin/python
)。如果初始化操作终止时显示非零退出代码,则集群创建操作将报告“ERROR”状态。如需调试初始化操作,请使用 SSH 连接集群的虚拟机实例,然后检查日志。 修复初始化操作问题后,您可以删除集群,然后重新创建集群。
如果您创建仅具有内部 IP 地址的 Dataproc 集群,则初始化操作中尝试通过互联网访问
github.com
的行为将失败,除非您已配置路由以引导流量通过 Cloud NAT 或 Cloud VPN。如果无权访问互联网,您可以启用专用 Google 访问通道,并将作业依赖项置于 Cloud Storage 中;集群节点就可以通过内部 IP 从 Cloud Storage 下载依赖项了。您可以使用 Dataproc 自定义映像(而非初始化操作)来设置作业依赖项。
初始化处理:
- 2.0 版之前的映像集群:
- 主实例:为了允许在主实例上运行的初始化操作将文件写入 HDFS,在 HDFS 可写入数据之前,主节点初始化操作不会启动(直到 HDFS 退出安全模式,并且至少有两个 HDFS 数据节点已联接)。
- 工作器:如果您将
dataproc:dataproc.worker.custom.init.actions.mode
集群属性设置为RUN_BEFORE_SERVICES
,则每个工作器都会先运行其初始化操作,然后再启动其 HDFS 数据节点和 YARN 节点管理器守护程序。由于 Dataproc 不会在可写入 HDFS 之前运行主实例初始化操作(这需要运行 2 个 HDFS 数据节点守护程序),因此设置此属性可能会增加集群创建时间。
2.0 版或更高版本的映像集群:
- 主实例:主实例节点初始化操作可能会在可写入 HDFS 之前运行。如果您运行在 HDFS 中暂存文件的初始化操作或者根据依赖于 HDFS 的服务(如 Ranger)的可用性来运行初始化操作,请将
dataproc.master.custom.init.actions.mode
集群属性设置为RUN_AFTER_SERVICES
。注意:由于此属性设置可能会增加集群创建时间(请参阅 2.0 之前的映像集群工作器的集群创建延迟说明),因此请仅在必要时才使用此设置(一般而言,请根据此属性的默认RUN_BEFORE_SERVICES
设置来决定)。 - 工作器:
dataproc:dataproc.worker.custom.init.actions.mode
集群属性设置为RUN_BEFORE_SERVICES
,并且在创建集群时无法传递给集群(您无法更改属性设置)。每个工作器都会先运行其初始化操作,然后再启动其 HDFS 数据节点和 YARN 节点管理器守护程序。由于 Dataproc 在运行主实例初始化操作之前不会等待 HDFS 变为可写入状态,因此主实例和工作器初始化操作会并行运行。
- 主实例:主实例节点初始化操作可能会在可写入 HDFS 之前运行。如果您运行在 HDFS 中暂存文件的初始化操作或者根据依赖于 HDFS 的服务(如 Ranger)的可用性来运行初始化操作,请将
建议:
- 2.0 版之前的映像集群:
使用初始化操作
无论您以何种方式创建集群,您都可以通过以下方式指定集群的初始化操作:
- 通过 Google Cloud 控制台
- 使用 gcloud CLI
- 使用 Dataproc clusters.create API,以编程方式实现(请参阅 NodeInitializationAction)
gcloud 命令
使用 gcloud dataproc clusters create 命令创建集群时,请使用 --initialization-actions
标志指定初始化可执行文件或脚本的一个或多个以英文逗号分隔的 Cloud Storage 位置 (URI)。注意:Cloud Storage 位置 URI 中不支持“gs://”开头之后出现多个连续的“/”,例如“gs://bucket/my//object//name”。如需获取命令信息,请运行 gcloud dataproc clusters create --help
。
gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \ --initialization-action-timeout=timeout-value (default=10m) \ ... other flags ...
- 使用
--initialization-action-timeout
标志指定初始化操作的超时期限。默认超时值为 10 分钟。如果初始化可执行文件或脚本在超时期限结束时尚未完成,则 Dataproc 将取消初始化操作。 - 在节点管理器和数据节点守护进程启动之前,使用
dataproc:dataproc.worker.custom.init.actions.mode
集群属性在主工作器上运行初始化操作。
REST API
在 ClusterConfig.initializationActions 数组中指定一个或多个脚本或可执行文件作为 clusters.create API 请求的一部分。
示例
POST /v1/projects/my-project-id/regions/us-central1/clusters/ { "projectId": "my-project-id", "clusterName": "example-cluster", "config": { "configBucket": "", "gceClusterConfig": { "subnetworkUri": "default", "zoneUri": "us-central1-b" }, "masterConfig": { "numInstances": 1, "machineTypeUri": "n1-standard-4", "diskConfig": { "bootDiskSizeGb": 500, "numLocalSsds": 0 } }, "workerConfig": { "numInstances": 2, "machineTypeUri": "n1-standard-4", "diskConfig": { "bootDiskSizeGb": 500, "numLocalSsds": 0 } }, "initializationActions": [ { "executableFile": "gs://cloud-example-bucket/my-init-action.sh" } ] } }
控制台
将参数传递给初始化操作
Dataproc 为集群中运行的实例设置特殊的元数据值。您可以将自己的自定义元数据设置为将参数传递给初始化操作的方式。
gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \ --metadata=name1=value1,name2=value2... \ ... other flags ...
您可以在初始化操作中读取元数据值,如下所示:
var1=$(/usr/share/google/get_metadata_value attributes/name1)
节点选择
如果要将初始化操作限制为主实例、主控节点或工作器节点,您可以将简单的节点选择逻辑添加到可执行文件或脚本中。
ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role) if [[ "${ROLE}" == 'Master' ]]; then ... master specific actions ... else if [[ "${ROLE}" == 'Driver' ]]; then ... driver specific actions ... else ... worker specific actions ... fi
暂存二进制文件
常见的集群初始化场景:在集群上暂存作业二进制文件,以免每次提交作业时都需要暂存二进制文件。例如,假设以下初始化脚本存储在 Cloud Storage 存储桶位置 gs://my-bucket/download-job-jar.sh
中:
#!/bin/bash ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role) if [[ "${ROLE}" == 'Master' ]]; then gcloud storage cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username fi
此脚本的位置可以传递给 gcloud dataproc clusters create
命令:
gcloud dataproc clusters create my-dataproc-cluster \ --region=${REGION} \ --initialization-actions=gs://my-bucket/download-job-jar.sh
Dataproc 将在所有节点上运行该脚本,并且,它会根据该脚本的节点选择逻辑,将 jar 下载到主实例节点中。随后,提交的作业可以使用预先暂存的 jar:
gcloud dataproc jobs submit hadoop \ --cluster=my-dataproc-cluster \ --region=${REGION} \ --jar=file:///home/username/sessionalize-logs-1.0.jar
初始化操作示例
常用初始化操作脚本和其他示例初始化操作脚本位于区域公共 Cloud Storage 存储分区 gs://goog-dataproc-initialization-actions-<REGION>
和 GitHub 代码库中。如需贡献脚本,请查看 CONTRIBUTING.md
文档,然后提交拉取请求。
日志
每个实例执行各初始化操作后的输出结果记录在 /var/log/dataproc-initialization-script-X.log
内,其中 X
是每个连续初始化操作脚本的索引(从零开始)。例如,如果您的集群有两个初始化操作,则输出将记录在 /var/log/dataproc-initialization-script-0.log
和 /var/log/dataproc-initialization-script-1.log
中。
后续步骤
探索 GitHub 初始化操作。