创建 Managed Service for Apache Spark 自定义映像

您可以使用包含 预安装软件包的 自定义映像来创建 Managed Service for Apache Spark 集群。本页介绍了如何创建自定义映像并将其安装到 Managed Service for Apache Spark 集群上。

使用注意事项和限制

准备工作

请务必在生成自定义映像前设置好项目。

设置项目

  1. 登录您的 Google Cloud 账号。如果您是新手 Google Cloud, 请创建一个账号来评估我们的产品在 实际场景中的表现。新客户还可获享 $300 赠金,用于 运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. 安装 Google Cloud CLI。

  6. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  7. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. 安装 Google Cloud CLI。

  12. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  13. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  14. 安装 Python 3.11+
  15. 准备安装自定义包和/或更新配置的自定义脚本,例如:
      #! /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. 创建存储桶 页面上,输入您的存储桶信息。要转到下一步 ,请点击继续
    1. 开始使用 部分中,执行以下操作:
      • 输入符合 存储桶命名要求的全局唯一的名称。
      • 如需添加 存储桶标签, 请展开 标签 部分 (), 点击 添加标签,并为标签指定 keyvalue
    2. 选择存储数据的位置 部分中,执行以下操作:
      1. 选择位置类型
      2. 位置类型下拉菜单中选择一个位置,用于永久存储存储桶中的数据。
      3. 如需设置 跨存储桶复制,请选择 通过 Storage Transfer Service 添加跨存储桶复制 ,然后 按照以下步骤操作:

        设置跨存储桶复制

        1. 存储桶 菜单中,选择一个存储桶。
        2. 复制设置 部分中, 点击配置 以配置 复制作业的设置。

          系统会显示配置跨存储桶复制 窗格 显示。

          • 如需按对象名称前缀过滤要复制的对象, 请输入要用于包含或排除对象的前缀,然后点击 添加前缀
          • 如需为复制的对象设置存储类别, 请从存储类别菜单中选择一个存储类别。 如果您跳过此步骤,则复制的对象会默认使用 目标存储桶的存储类别。
          • 点击完成
    3. 选择存储数据的方式 部分中,执行以下操作:
      1. 为存储桶选择默认存储类别,或者选择Autoclass对存储桶数据进行自动存储类别管理。
      2. 如需启用 分层命名空间,请在 针对数据密集型工作负载优化存储 部分中,选择 在此存储桶上启用分层命名空间
    4. 选择如何控制对对象的访问权限 部分中,选择 存储桶是否强制执行禁止公开访问, 然后为存储桶对象选择访问权限控制方法
    5. 选择如何保护对象数据 部分中,执行以下操作:
      • 数据保护 下,选择您要为存储桶设置的任何选项。
        • 如需启用 软删除,请点击 软删除政策(用于数据恢复) 复选框, 然后指定您希望在删除对象后保留对象的天数。
        • 如需设置 对象版本控制,请点击 对象版本控制(用于版本控制) 复选框, 然后指定每个对象的最大版本数以及非当前版本过期后的天数。
        • 如需对对象和存储分区启用保留政策,请点击保留(用于合规性) 复选框,然后执行以下操作:
          • 如需启用 对象保留锁定,请点击 启用对象保留 复选框。
          • 如需启用 存储桶锁定,请点击 设置存储桶保留政策 复选框,然后为保留期限选择时间单位和时间长度。
      • 如需选择对象数据的加密方式,请展开 数据加密 部分 (),然后选择 数据加密 方法
  4. 点击创建

生成自定义映像

您使用 generate_custom_image.py( 一个 Python 程序)来创建 Managed Service for Apache Spark 自定义映像。

工作原理

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

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

运行代码

Managed Service for Apache Spark 自定义映像上创建分支或克隆 GitHub 上的文件。

然后,运行 generate_custom_image.py 脚本以使 Managed Service for Apache Spark 生成并保存您的自定义映像。

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:自定义映像的输出名称。

  • --dataproc-version:要在自定义映像中使用的 Managed Service for Apache Spark 映像版本 。以 x.y.z-osx.y.z-rc-os 格式指定版本,例如“2.0.69-debian10”。

  • --customization-script:脚本的本地路径,该工具将运行此脚本以安装自定义软件包或执行其他自定义操作。此脚本仅在用于创建自定义映像的临时虚拟机上作为 Linux 启动脚本运行。您可以为使用自定义映像创建集群时要执行的其他初始化操作指定不同的初始化脚本。

    跨项目映像:如果您的自定义映像用于在不同项目中创建集群,可能会因为映像中存储的 gcloudgsutil 命令缓存而出现错误。您可以在自定义脚本中添加以下命令来清除缓存的凭证,从而避免此问题。

    rm -r /root/.gsutil /root/.config/gcloud
    
  • --zoneCompute Engine 区域generate_custom_image.py 将在其中创建用于生成自定义映像的临时虚拟机。

  • --gcs-bucket:URI,格式为 gs://BUCKET_NAME,指向您的 Cloud Storage 存储桶generate_custom_image.py 会将日志文件写入此存储桶。

可选标志

  • --family:自定义映像的映像系列。映像系列用于将类似的映像组合在一起,可用于创建集群作为指向系列中最新映像的指针。例如 custom-2-2-debian12
  • --no-smoke-test:这是一个可选标志,用于禁止对新构建的自定义映像进行冒烟测试。冒烟测试会使用新构建的映像创建 Managed Service for Apache Spark 测试集群,运行小型作业,然后在测试结束时删除集群。默认情况下,系统将运行冒烟测试,以验证新构建的自定义映像是否可以创建正常运行的 Managed Service for Apache Spark 集群。使用 --no-smoke-test 标志跳过此步骤可以加快自定义映像构建流程,但不推荐这样做。
  • --subnet:用于创建构建自定义 Managed Service for Apache Spark 映像的虚拟机的子网。如果您的项目属于 共享 VPC,则必须按以下格式指定完整子网网址 :projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
  • --optional-components:此标志仅在使用基础映像版本 2.3 及更高版本时可用。要在映像中安装的 可选组件的 列表,例如 SOLR、RANGER、TRINO、DOCKER、FLINK、HIVE_WEBHCAT、ZEPPELIN、HUDI、ICEBERG 和 PIG(PIG 在映像版本 2.3 及 更高版本中作为可选组件提供)。

    示例:Google Cloud CLI 集群创建命令:

    gcloud dataproc clusters create CLUSTER_NAME
        --image=CUSTOM_IMAGE_URI  \
        --optional-components=COMPONENT_NAME \
        ... other flags
    

如需查看可用的可选标志的列表,请参阅 GitHub 上的可选参数

如果 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.
#####################################################################

自定义映像版本标签(高级用法)

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

高级用法:如果您使用自己的流程创建自定义 Managed Service for Apache Spark 映像,则必须将 goog-dataproc-version 标签手动添加到自定义映像,如下所示:

  1. 从用于创建自定义映像的基础 Managed Service for Apache Spark 映像中提取 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,...]
    

使用自定义映像

您可以在创建 Managed Service for Apache Spark 集群时指定自定义映像。 自定义映像保存在 Cloud Compute Images中,自创建之日起 365 天内可用于创建 Managed Service for Apache Spark 集群(请参阅使用过期的自定义映像创建集群,以便在 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

Google Cloud CLI

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

gcloud compute images list

将自定义映像的名称传递到以下命令,以列出自定义映像的 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→映像页面,然后点击映像名称。 您可以在 filter images 字段中插入查询,以限制显示的映像数量。
  2. 映像详情页面打开。点击等效 REST
  3. REST 响应列出了有关映像的其他信息,包括 selfLink(即映像 URI)。
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
      "sourceDisk": ...,
      ...
    }
    

使用自定义映像创建集群

使用 gcloud CLI、Managed Service for Apache Spark API 或 控制台 创建集群。Google Cloud

gcloud CLI

使用带有 --image 标志的 dataproc clusters create 命令创建具有自定义映像的 Managed Service for Apache Spark 集群。

示例
gcloud dataproc clusters create CLUSTER-NAME \
    --image=CUSTOM_IMAGE_URI \
    --region=REGION \
    ... other flags

REST API

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

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

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. 打开 Managed Service for Apache Spark 创建集群 页面。设置集群 面板已处于选中状态。
  2. 版本控制 部分,点击变更 。 选择自定义映像 标签页,选择要用于 Managed Service for Apache Spark 集群的自定义映像,然后点击选择。集群的虚拟机将使用所选的自定义映像进行配置。

使用自定义映像替换 Managed Service for Apache Spark 集群属性

您可以使用自定义映像覆盖 在创建集群期间设置的集群属性 。如果您使用自定义映像创建集群,且集群创建操作设置的属性值与自定义映像中的属性值不同,则以自定义映像设置的值为准。

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

  1. 在自定义映像自定义脚本中,在 /etc/google-dataproc 中创建一个 dataproc.custom.properties 文件,然后在该文件中设置集群属性值。

    • 示例 dataproc.custom.properties 文件:
    dataproc.conscrypt.provider.enable=VALUE
    dataproc.logging.stackdriver.enable=VALUE
    
    • 用于替换两个集群属性的自定义脚本文件创建代码段示例:
    cat <<EOF >/etc/google-managed-spark/dataproc.custom.properties
    dataproc.conscrypt.provider.enable=true
    dataproc.logging.stackdriver.enable=false
    EOF
    

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

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

  1. 尝试创建 Managed Service for Apache Spark 集群,其中包含过期的自定义映像或将在 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

TOKEN_VALUE 字符串复制到剪贴板。

  1. 使用 gcloud CLI 再次创建 Managed Service for Apache Spark 集群, 并将复制的 TOKEN_VALUE 添加为集群属性。

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

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