初始化操作

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

您可以在以下位置找到示例初始化操作脚本: 注意:Google 不支持这些示例

重要注意事项和指南

  • 请勿创建引用位于 gs://goog-dataproc-initialization-actions-REGION 公共存储分区中的初始化操作的生产集群。这些脚本将作为参考实现提供。它们会与正在进行的 GitHub 代码库更改同步,对这些脚本的更新可能会破坏集群创建。请改为将初始化操作从公共存储桶复制到有版本控制的 Cloud Storage 存储桶文件夹中,如以下示例所示:

    REGION=COMPUTE_REGION
    gsutil 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
    
    然后,通过引用 Cloud Storage 中的副本来创建集群:
    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 NATCloud VPN。如果无权访问互联网,您可以启用专用 Google 访问通道并将作业依赖项放置在 Cloud Storage 中;集群节点可以通过内部 IP 从 Cloud Storage 下载依赖项。

  • 您可以使用 Dataproc 自定义映像(而非初始化操作)来设置作业依赖项。

  • 初始化处理

    • 2.0 版之前的映像集群:
      • 工作器:如果您将 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 变为可写入状态,因此主实例和工作器初始化操作会并行运行。
    • 建议:

      • 使用元数据来确定节点的角色,以便有条件地对节点执行初始化操作(请参阅使用集群元数据)。
      • 创建对 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 数组中指定一个或多个脚本或可执行文件作为 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 创建集群页面,然后选择自定义集群面板。
  • 在“初始化操作”部分的可执行文件字段中输入每个初始化操作的 Cloud Storage 存储桶位置。点击浏览以打开 Google Cloud 控制台的 Cloud Storage 浏览器页面,然后选择脚本或可执行文件。点击 Add Initialization Action 以添加每个文件。
  • 将参数传递给初始化操作

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

    后续步骤

    探索 GitHub 初始化操作