创建 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 连接到集群的虚拟机实例,然后检查 logs。 修复初始化操作问题后,您可以删除集群,然后重新创建集群。
如果您使用以下内容创建 Dataproc 集群: 仅限内部 IP 地址, 在初始化操作中尝试通过互联网访问
github.com
都将失败,除非您已配置路由来引导流量通过, Cloud NAT或 Cloud VPN。不包含 以及访问互联网的权限,您可以启用 专用 Google 访问通道 并将作业依赖项放置在 Cloud Storage 中; 集群节点可以从 Cloud Storage 下载依赖项, 内部 IP 地址。您可以使用 Dataproc 自定义映像(而非初始化操作)来设置作业依赖项。
初始化处理:
- 2.0 版之前的映像集群:
- 主实例:允许在主实例上运行初始化操作 向 HDFS 写入文件, HDFS 是可写的(直到 HDFS 退出安全模式且至少有两个 HDFS 为止)。 DataNode 已加入联接)。
- 工作器:如果您将
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
设置)。 - Worker:
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
暂存二进制文件
常见的集群初始化场景:在集群上暂存作业二进制文件,以免每次提交作业时都需要暂存二进制文件。例如,假设以下初始化脚本存储在
gs://my-bucket/download-job-jar.sh
,Cloud Storage 存储桶
地点:
#!/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 初始化操作。