初始化操作

创建 Dataproc 集群时,您可以在可执行文件或脚本(Dataproc 会在 Dataproc 集群设置完成后立即在集群中的所有节点上运行这些可执行文件或脚本)中指定初始化操作。初始化操作通常会设置作业依赖关系组件(比如安装 Python 软件包),以便作业可以提交到集群,而无需在作业运行时安装依赖关系组件。

您可以在以下位置找到常用的初始化操作脚本和其他示例初始化操作脚本:

重要注意事项和指南

  • 请勿创建引用位于公共存储分区 gs://goog-dataproc-initialization-actions-<REGION>> 中的初始化操作的生产集群。 这些脚本作为引用实现提供,并与不断进行的 GitHub 代码库更改同步 — 公共存储分区中的新版初始化操作可能会破坏您的集群创建。 而是应该如下示例所示那样,将初始化操作从公共存储分区复制到您的存储分区中:
    REGION=region
    
    gsutil cp gs://goog-dataproc-initialization-actions-${REGION}/presto/presto.sh gs://my-bucket/
    
    然后,通过引用该副本来创建集群:
    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/presto.sh \
        ... other flags ...
    
    您可以决定何时将您的初始化操作副本与公共存储分区或 GitHub 代码库中发生变化的初始化操作进行同步。
  • 创建集群的过程中,在每个节点上执行初始化操作。在扩充自动扩充集群时,新添加的每个节点上也会执行这些操作。
  • 初始化操作以 root 用户身份运行。这意味着您 **无需** 使用 sudo
  • 您应在初始化操作中使用绝对路径
  • 您的初始化操作应使用 shebang 行来指明脚本的解析方式(例如 #!/bin/bash#!/usr/bin/python)。
  • 如果初始化操作终止时显示非零退出代码,则集群创建操作将报告“ERROR”状态。要调试初始化操作,请通过 SSH 连接集群的虚拟机实例并检查日志。 修复初始化操作问题后,您可以删除集群,然后重新创建集群。
  • 如果您创建仅具有内部 IP 地址的 Dataproc 集群,则初始化操作中尝试通过互联网访问 github.com 的行为将失败,除非您已配置路由以引导流量通过 Cloud NATCloud VPN。如果无权访问互联网,您可以启用专用 Google 访问通道,并将作业依赖项置于 Cloud Storage 中;集群节点就可以通过内部 IP 从 Cloud Storage 下载依赖项了。
  • 您可以使用 Dataproc 自定义映像(而非初始化操作)来设置作业依赖项。
  • 初始化处理
    • 在 HDFS 可写入数据之前,主节点初始化操作不会启动(直到 HDFS 退出安全模式,并且至少有两个 HDFS 数据节点已联接)。这允许初始化操作在主实例上运行,将文件写入 HDFS。
    • 如果设置了 dataproc:dataproc.worker.custom.init.actions.mode=RUN_BEFORE_SERVICES 集群属性,则每个工作器将在启动其 HDFS 数据节点守护进程之前运行其初始化操作。 请注意,只有在至少两个工作器完成初始化操作后,系统才会启动主实例初始化操作,因此集群创建时间可能有所增加。
    • 在每个集群节点上,多个初始化操作按集群创建命令中指定的顺序运行。但是,不同节点上的初始化操作是独立处理的:工作器初始化操作可以与主实例初始化操作同时运行,也可以在主实例初始化操作之前或之后运行。
    • 用户在创建集群时选择的可选组件将在集群上运行初始化操作之前安装并激活。
    • 建议:
      • 使用元数据来确定节点的角色,以便有条件地对节点执行初始化操作(请参阅使用集群元数据)。
      • 创建对 Cloud Storage 存储分区的初始化操作的副本分支以实现稳定性(请参阅如何使用初始化操作)。
      • 在从互联网下载时添加重试,以帮助稳定初始化操作。

使用初始化操作

无论您以何种方式创建集群,您都可以通过以下方式指定集群的初始化操作:

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 数组中指定一个或多个 NodeInitializationAction 脚本或可执行文件,将其作为 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"
      }
    ]
  }
}

控制台

使用 Cloud Console 创建集群时,您可以在 Initialization actions 字段中指定一个或多个初始化操作。如需查看此字段,请展开高级选项面板。
在此表单中输入每个初始化操作的 Cloud Storage 位置。点击浏览,打开 Cloud Console Cloud Storage 浏览器页面,选择一个初始化文件。必须单独输入每个初始化文件(按 <Enter> 键添加新条目)。

将参数传递给初始化操作

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
  ... 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
  gsutil 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 中。

后续步骤

探索以下初始化操作: