初始化操作

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

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

重要注意事项和指南

  • 请勿创建引用 位于 gs://goog-dataproc-initialization-actions-REGION 公开存储分区。这些脚本作为参考实现提供。他们 与进行中的 GitHub 代码库更改,以及这些 API 的更新 可能会破坏您的集群创建。请将初始化操作从 存储在具有版本控制的 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
    
    然后,通过引用 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 连接到集群的虚拟机实例,然后检查 logs。 修复初始化操作问题后,您可以删除集群,然后重新创建集群。

  • 如果您使用以下内容创建 Dataproc 集群: 仅限内部 IP 地址, 在初始化操作中尝试通过互联网访问 github.com 都将失败,除非您已配置路由来引导流量通过, Cloud NATCloud VPN。不包含 以及访问互联网的权限,您可以启用 专用 Google 访问通道 并将作业依赖项放置在 Cloud Storage 中; 集群节点可以从 Cloud Storage 下载依赖项, 内部 IP 地址。

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

  • 初始化处理

    • 2.0 版之前的映像集群:
      • 主实例:允许在主实例上运行初始化操作 向 HDFS 写入文件, HDFS 是可写的(直到 HDFS 退出安全模式且至少有两个 HDFS 为止)。 DataNode 已加入联接)。
      • Worker:如果您将 dataproc:dataproc.worker.custom.init.actions.mode 集群属性RUN_BEFORE_SERVICES,每个工作器 启动其 HDFS 数据节点和 YARN 之前的初始化操作 nodemanager 守护程序。由于 Dataproc 不会在可写入 HDFS 之前运行主实例初始化操作(这需要运行 2 个 HDFS 数据节点守护程序),因此设置此属性可能会增加集群创建时间。
    • 2.0 版或更高版本的映像集群:

      • 主实例:主实例节点初始化操作可能会在可写入 HDFS 之前运行。如果您运行在 HDFS 中暂存文件的初始化操作或者根据依赖于 HDFS 的服务(如 Ranger)的可用性来运行初始化操作,请将 dataproc.master.custom.init.actions.mode 集群属性设置为 RUN_AFTER_SERVICES。注意:由于 属性设置可能会增加集群创建时间,请参阅 关于以下集群的集群创建延迟的说明: 2.0 之前的映像集群工作器 - 仅使用 (通常使用默认设置 RUN_BEFORE_SERVICES 设置)。
      • Workerdataproc:dataproc.worker.custom.init.actions.mode 集群属性 已设置为 RUN_BEFORE_SERVICES,并且 无法在创建集群时传递给集群 (您无法更改媒体资源设置)。每个工作器都会先运行其初始化操作,然后再启动其 HDFS 数据节点和 YARN 节点管理器守护程序。由于 Dataproc 在运行主实例初始化操作之前不会等待 HDFS 变为可写入状态,因此主实例和工作器初始化操作会并行运行。
    • 建议:

      • 使用元数据来确定节点的角色,以便有条件地对节点执行初始化操作(请参阅使用集群元数据)。
      • 创建对 Cloud Storage 存储分区的初始化操作的副本分支以实现稳定性(请参阅如何使用初始化操作)。
      • 增加从互联网下载时重试的次数,以保持稳定 初始化操作

使用初始化操作

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

gcloud 命令

使用 gcloud dataproc clusters create 命令,请指定一个或多个以英文逗号分隔的 Cloud Storage 位置 (URI) 使用 --initialization-actions 标志。注意:连续多次出现 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 浏览器。 页面以选择脚本或可执行文件。点击添加初始化操作。 添加每个文件
  • 将参数传递给初始化操作

    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 初始化操作