创建 Dataproc 自定义映像

Dataproc 集群可以预配包含用户预装软件包的自定义映像。以下步骤介绍如何创建自定义映像并将其安装在 Dataproc 集群上。

注意:

  • 本文档中的说明仅适用于 Linux 操作系统。未来的 Dataproc 版本可能会支持其他操作系统。
  • 自定义映像构建需要从 Dataproc 基础映像开始(当前支持 Debian 和 Ubuntu 基础映像)。

准备工作

设置项目

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Dataproc API, Compute Engine API, and Cloud Storage API。

    启用 API

  5. 安装并初始化 Cloud SDK
  6. 安装 Python 2.7+
  7. 准备安装自定义包和/或更新配置的自定义脚本,例如:
      #! /usr/bin/bash
      apt-get -y update
      apt-get install python-dev
      apt-get install python-pip
      pip install numpy
      

在项目中创建 Cloud Storage 存储分区

  1. 在 Cloud Console 中,转到 Cloud Storage 浏览器页面。

    转到“Cloud Storage 浏览器”页面

  2. 点击创建存储分区
  3. 创建存储分区对话框中,指定以下特性:
  4. 点击创建

生成自定义映像

您将使用 Python 程序 generate_custom_image.py 来创建 Dataproc 自定义映像。

工作原理

generate_custom_image.py 程序启动指定 Dataproc 基础映像的临时 Compute Engine 虚拟机实例,然后在虚拟机实例中运行自定义脚本以安装自定义软件包和/或更新配置。自定义脚本完成后,它将关闭虚拟机实例,并从虚拟机实例的磁盘创建 Dataproc 自定义映像。在创建自定义映像后,临时虚拟机将被删除。自定义映像已保存,可用于创建 Dataproc 集群

generate_custom_image.py 程序使用 gcloud(默认)在 Compute Engine 上运行多步骤工作流。

运行代码

Dataproc 自定义映像上创建分支或克隆 GitHub 上的文件。然后,运行 generate_custom_image.py 程序以使 Dataproc 生成并保存您的自定义映像。

python generate_custom_image.py \
    --image-name custom_image_name \
    [--family custom_image_family_name] \
    --dataproc-version Dataproc version (example: "1.5.10-debian10") \
    --customization-script local path to your custom script \
    --zone Compute Engine zone to use for the location of the temporary VM \
    --gcs-bucket URI (gs://bucket-name) of a Cloud Storage bucket in your project \
    [--no-smoke-test]

必要标志

  • --image-name:自定义映像的输出名称。注意:图片名称必须与正则表达式 [a-z](?:[-a-z0-9]{0,61}[a-z0-9]) 匹配,例如,不得包含下划线或空格,且不得超过 64 个字符。
  • --dataproc-version:要在您的自定义映像中使用的 Dataproc 映像版本。以“x.y.z-os”或“x.y.z-rc-os”格式指定版本,例如“1.5.10-debian10”、“1.5.10-ubuntu18”、“1.5.0-RC10-debian10”。
  • --customization-script:脚本的本地路径,该工具将运行此脚本以安装自定义软件包或执行其他自定义操作。请注意,此脚本仅在用于创建自定义映像的临时 VM 上运行。您可以为使用自定义映像创建集群时要执行的任何其他初始化操作指定不同的初始化脚本。
  • --zoneCompute Engine 地区,其中generate_custom_image.py 将在该地区创建用于创建自定义映像的临时虚拟机。
  • --gcs-bucket:URI,格式为 gs://bucket-name,它指向您在在项目中创建 Cloud Storage 存储分区中创建的 Cloud Storage 存储分区。generate_custom_image.py 会将日志文件写入此存储分区。

可选标志

  • --family:映像的映像系列。映像系列用于将类似的映像组合在一起,可用于创建集群作为指向系列中最新映像的指针。例如,“custom-1-5-debian10”。
  • --no-smoke-test:这是一个可选标志,用于禁止对新构建的自定义映像进行冒烟测试。冒烟测试会使用新构建的映像创建 Dataproc 测试集群,运行小型作业,然后在测试结束时删除集群。默认情况下,系统将运行冒烟测试,以验证新构建的自定义映像是否可以创建正常运行的 Dataproc 集群。使用 --no-smoke-test 标志停用此步骤将加快自定义映像构建过程,但不建议使用。

如需查看其他可选标志的列表,请参阅 GithHub 上的可选参数

如果 gcloud 命令成功,自定义映像的 imageURI 将在终端窗口输出中列出(完整的 imageUri粗体显示如下):

...
managedCluster:
    clusterName: verify-image-20180614213641-8308a4cd
    config:
      gceClusterConfig:
        zoneUri: zone
      masterConfig:
        imageUri: https://www.googleapis.com/compute/beta/projects/project-id/global/images/custom-image-name
...

INFO:__main__:Successfully built Dataproc custom image: custom-image-name
INFO:__main__:

#####################################################################
  WARNING: DATAPROC CUSTOM IMAGE 'custom-image-name'
           WILL EXPIRE ON 2018-07-14 21:35:44.133000.
#####################################################################

高级用户的自定义映像版本标签

使用 Dataproc 的标准自定义映像工具时,该工具会自动在创建的自定义映像上设置必需的 goog-dataproc-version 标签。该标签反映了 Dataproc 用于管理映像上的软件的功能和协议。

使用自己的进程创建自定义 Dataproc 映像的高级用户必须将标签手动添加到其自定义映像,如下所示:

  1. 从用于创建自定义映像的基础 Dataproc 映像中提取 goog-dataproc-version 标签。

    gcloud compute images describe ${BASE_DATAPROC_IMAGE} \
        --project cloud-dataproc \
        --format="value(labels.goog-dataproc-version)"
    

  2. 在自定义映像上设置标签。

    gcloud compute images add-labels IMAGE_NAME --labels=[KEY=VALUE,...]

使用自定义映像

您可以在创建 Dataproc 集群时指定自定义映像。自定义映像保存在 Cloud Compute 映像中,自创建之日起 60 天内可用于创建 Dataproc 集群(请参阅如何使用过期的自定义映像创建集群,以便在 60 天过期日期后使用自定义映像)。

自定义映像 URI

您将自定义映像的 imageUri 传递给集群创建操作。 该 URI 可以使用以下三种方法之一指定:

  1. 完整 URI:
    https://www.googleapis.com/compute/beta/projects/project-id/global/images/custom-image-name
  2. 部分 URI:projects/project-id/global/images/custom-image-name
  3. 简称:custom-image-name

自定义映像还可以通过其系列 URI 指定,该 URI 始终会选择映像系列中的最新映像。

  1. 完整 URI:
    https://www.googleapis.com/compute/beta/projects/project-id/global/images/family/custom-image-family-name
  2. 部分 URI:projects/project-id/global/images/family/custom-image-family-name

如何查找自定义映像 URI

gcloud 命令

运行以下 gcloud 命令可列出自定义映像的名称:

gcloud compute images list

将自定义映像的名称传递到以下 gcloud 命令,以列出自定义映像的 URI (selfLink):

gcloud compute images describe custom-image-name
...
name: custom-image-name
selfLink: https://www.googleapis.com/compute/v1/projects/project-id/global/images/custom-image-name
...

控制台

  1. 在 Cloud Console 中打开 Compute Engine→映像页面,然后点击映像名称。您可以在过滤映像文本框中插入查询,以限制显示的映像数量。
  2. 映像详情页面打开。点击等效 REST
  3. REST 响应列出了有关映像的其他信息,包括 selfLink(即映像 URI)。
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/my-project-id/global/images/my-custom-image",
      "sourceDisk": ...,
      ...
    }
    

使用自定义映像创建集群

您可以通过 gcloud 命令行工具、Dataproc API 或 Google Cloud Console 来创建集群,该集群包含使用自定义映像的主节点和工作器节点。

gcloud 命令

您可以通过带有 --image 标志的 dataproc clusters create 命令来使用自定义映像创建 Dataproc 集群。例如:
gcloud dataproc clusters create cluster-name \
    --image=custom-image-URI \
    --region=region \
    ... other flags ...

REST API

cluster.create API 请求所包含的 masterConfigworkerConfigsecondaryWorkerConfig 对象(若适用)的 InstanceGroupConfig.imageUri 字段中,您可以通过指定自定义映像 URI 来创建使用自定义映像的集群。

示例:使用 REST 请求创建一个使用自定义映像的标准 Dataproc 集群(包含一个主节点,两个工作器节点)。

POST /v1/projects/project-id/regions/global/clusters/
{
  "clusterName": "custom-name",
  "config": {
    "masterConfig": {
      "imageUri": "projects/project-id/global/images/custom-image-name"
    },
    "workerConfig": {
      "imageUri": "projects/project-id/global/images/custom-image-name"
    }
  }
}
  

控制台

  1. 在 Cloud Console 中,打开 Dataproc 创建集群页面。选中“设置集群”面板。
  2. 在“版本控制”部分中,点击“变更”。选择“自定义映像”标签页,选择要用于 Dataproc 集群的自定义映像,然后点击“选择”。

提交创建集群表单时,您集群的虚拟机可配置选定的自定义映像。

如何创建具有过期自定义映像的集群

默认情况下,自定义映像会在其创建之日起 60 天后到期。 您可以通过完成以下步骤来创建使用过期自定义映像的集群。

  1. 尝试创建 Dataproc 集群,其中包含过期的自定义映像或将在 10 天后过期的自定义映像。

    gcloud dataproc clusters create cluster-name \
        --image=custom-image-name \
        --region=region \
        ... other flags ...
    

  2. gcloud 工具将发出包含集群 dataproc:dataproc.custom.image.expiration.token 属性名称和令牌值的错误消息。

    dataproc:dataproc.custom.image.expiration.token=token value
    
    将“令牌值”字符串复制到剪贴板。

  3. 使用 gcloud 工具再次创建 Dataproc 集群,添加上面复制的“令牌值”作为集群属性。

    gcloud dataproc clusters create cluster-name \
        --image=custom-image-name \
        --properties dataproc:dataproc.custom.image.expiration.token=token value \
        --region=region \
        ... other flags ...
    

使用自定义映像创建集群应会成功。