创建 Dataproc 自定义映像

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

备注:

  • 本文档中的说明仅适用于 Linux 操作系统。未来的 Dataproc 版本可能会支持其他操作系统。
  • 自定义映像构建需要从 Dataproc 基础映像(支持 Debian、Rocky Linux 和 Ubuntu 基础映像)开始。
  • 使用可选组件:默认情况下,自定义映像会从他们的基本映像继承 Dataproc 可选组件(操作系统软件包和配置),您可以自定义默认操作系统软件包版本和配置,但必须在创建集群时指定可选的组件名称(例如,通过运行 gcloud dataproc clusters create --optional-components=COMPONENT_NAME 命令-请参阅添加可选组件)。 如果您在创建集群时未指定组件名称,则系统会删除该组件(包括任何自定义操作系统软件包和配置)。

准备工作

设置项目

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

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

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  8. 确保您的 Google Cloud 项目已启用结算功能

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

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  12. 安装 Python 3.11 及更高版本
  13. 准备安装自定义包和/或更新配置的自定义脚本,例如:
      #! /usr/bin/bash
      apt-get -y update
      apt-get install python-dev
      apt-get install python-pip
      pip install numpy
      

在您的项目中创建 Cloud Storage 存储桶

  1. 在 Google Cloud 控制台中,进入 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 CLI 在 Compute Engine 上运行多步骤工作流。

运行代码

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

python3 generate_custom_image.py \
    --image-name=CUSTOM_IMAGE_NAME \
    [--family=CUSTOM_IMAGE_FAMILY_NAME] \
    --dataproc-version=IMAGE_VERSION \
    --customization-script=LOCAL_PATH \
    --zone=ZONE \
    --gcs-bucket=gs://BUCKET_NAME \
    [--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”格式指定版本,例如“2.0.69-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 标志停用此步骤将加快自定义映像构建过程,但不建议使用。
  • --subnet:用于创建用于构建自定义 Dataproc 映像的虚拟机的子网。如果您的项目属于共享 VPC,则必须按以下格式指定完整的子网网址:projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET

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

如果 generate_custom_image.py 成功,自定义映像的 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 映像中,自创建之日起 365 天内可用于创建 Dataproc 集群(请参阅如何使用过期的自定义映像创建集群,以便在 365 天过期日期后使用自定义映像)。

自定义映像 URI

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

  1. 完整 URI:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/`gs://`BUCKET_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/var>
  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. 在 Google Cloud 控制台中打开 Compute Engine→映像页面,然后点击映像名称。 您可以在过滤映像文本框中插入查询,以限制显示的映像数量。
  2. 映像详情页面打开。点击等效 REST
  3. REST 响应列出了有关映像的其他信息,包括 selfLink(即映像 URI)。
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
      "sourceDisk": ...,
      ...
    }
    

使用自定义映像创建集群

您可以使用 gcloud 命令行工具、Dataproc API 或 Google Cloud 控制台创建具有主节点和工作器节点(这些节点使用自定义映像)的集群

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/REGION/clusters/
{
  "clusterName": "CLUSTER_NAME",
  "config": {
    "masterConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    },
    "workerConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    }
  }
}
  

控制台

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

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

使用自定义映像替换 Dataproc 集群属性

您可以使用自定义映像覆盖在创建集群期间设置的任何集群属性。如果用户使用自定义映像创建集群,但设置的集群属性与使用自定义映像来设置的属性不同,则自定义映像集群属性设置的优先级更高。

如需使用自定义映像设置集群属性,请执行以下操作:

  1. 在自定义映像自定义脚本中,在 /etc/google-dataproc 中创建一个 dataproc.custom.properties 文件,然后在该文件中设置集群属性值。
    • dataproc.custom.properties 文件内容示例:
      dataproc.conscrypt.provider.enable=VALUE
      dataproc.logging.stackdriver.enable=VALUE
      

用于替换两个集群属性的自定义脚本文件创建代码段示例:

     cat <<EOF >/etc/google-dataproc/dataproc.custom.properties
     dataproc.conscrypt.provider.enable=true
     dataproc.logging.stackdriver.enable=false
     EOF

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

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

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

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --region=REGION \
        ... other flags ...
    

  2. gcloud CLI 将发出一条错误消息,其中包含集群 dataproc:dataproc.custom.image.expiration.token 属性名称和令牌值。

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

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

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --properties=dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE \
        --region=REGION \
        ... other flags ...
    

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