Dataproc 集群可以预配包含用户预装软件包的自定义映像。以下步骤介绍如何创建自定义映像并将其安装在 Dataproc 集群上。
注意:
- 本文档中的说明仅适用于 Linux 操作系统。未来的 Dataproc 版本可能会支持其他操作系统。
- 自定义映像构建需要从 Dataproc 基础映像开始(Debian、Rocky Linux 和 Ubuntu 基础映像受支持)。
- 使用可选组件:默认情况下,自定义映像会从他们的基本映像继承 Dataproc 可选组件(操作系统软件包和配置),您可以自定义默认操作系统软件包版本和配置,但必须在创建集群时指定可选的组件名称(例如,通过运行
gcloud dataproc clusters create --optional-components=component-name
命令-请参阅添加可选组件)。 如果您在创建集群时未指定组件名称,则系统会删除该组件(包括任何自定义操作系统软件包和配置)。
准备工作
设置项目
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
启用 Dataproc API, Compute Engine API, and Cloud Storage API。
- 安装并初始化 Google Cloud CLI。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
启用 Dataproc API, Compute Engine API, and Cloud Storage API。
- 安装并初始化 Google Cloud CLI。
- 安装 Python 2.7+
- 准备安装自定义包和/或更新配置的自定义脚本,例如:
#! /usr/bin/bash apt-get -y update apt-get install python-dev apt-get install python-pip pip install numpy
在您的项目中创建 Cloud Storage 存储分区
- 在 Cloud Console 中,转到 Cloud Storage 浏览器页面。
- 点击创建存储分区。
- 在创建存储分区页面上,输入您的存储分区信息。要转到下一步,请点击继续。
- 点击创建。
生成自定义映像
您将使用 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 映像版本。以“xxx-os”或“xxx-rc-os”格式指定版本,例如“1.5.35-debian10”。--customization-script
:脚本的本地路径,该工具将运行此脚本以安装自定义软件包或执行其他自定义操作。请注意,此脚本仅在用于创建自定义映像的临时 VM 上运行。您可以为使用自定义映像创建集群时要执行的任何其他初始化操作指定不同的初始化脚本。--zone
:Compute 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 映像的高级用户必须将标签手动添加到其自定义映像,如下所示:
从用于创建自定义映像的基础 Dataproc 映像中提取
goog-dataproc-version
标签。gcloud compute images describe ${BASE_DATAPROC_IMAGE} \ --project cloud-dataproc \ --format="value(labels.goog-dataproc-version)"
在自定义映像上设置标签。
gcloud compute images add-labels IMAGE_NAME --labels=[KEY=VALUE,...]
使用自定义映像
您可以在创建 Dataproc 集群时指定自定义映像。自定义映像保存在 Cloud Compute 映像中,自创建之日起 60 天内可用于创建 Dataproc 集群(请参阅如何使用过期的自定义映像创建集群,以便在 60 天过期日期后使用自定义映像)。
自定义映像 URI
您将自定义映像的 imageUri
传递给集群创建操作。
该 URI 可以使用以下三种方法之一指定:
- 完整 URI:
https://www.googleapis.com/compute/beta/projects/project-id/global/images/custom-image-name
- 部分 URI:
projects/project-id/global/images/custom-image-name
- 简称:custom-image-name
自定义映像还可以通过其系列 URI 指定,该 URI 始终会选择映像系列中的最新映像。
- 完整 URI:
https://www.googleapis.com/compute/beta/projects/project-id/global/images/family/custom-image-family-name
- 部分 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 ...
控制台
- 在 Cloud Console 中打开 Compute Engine→映像页面,然后点击映像名称。您可以在过滤映像文本框中插入查询,以限制显示的映像数量。
- 映像详情页面打开。点击等效 REST。
- 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 请求所包含的masterConfig
、workerConfig
和 secondaryWorkerConfig
对象(若适用)的 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" } } }
控制台
- 在 Cloud Console 中,打开 Dataproc 创建集群页面。选中“设置集群”面板。
- 在“版本控制”部分中,点击“变更”。选择“自定义映像”标签页,选择要用于 Dataproc 集群的自定义映像,然后点击“选择”。
提交创建集群表单时,您集群的虚拟机可配置选定的自定义映像。
使用自定义映像替换 Dataproc 集群属性
您可以使用自定义映像覆盖在创建集群期间设置的任何集群属性。如果用户使用自定义映像创建集群,但设置的集群属性与使用自定义映像来设置的属性不同,则自定义映像集群属性设置的优先级更高。
如需使用自定义映像设置集群属性,请执行以下操作:
- 在自定义映像自定义脚本中,在
/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
如何创建具有过期自定义映像的集群
默认情况下,自定义映像会在其创建之日起 60 天后到期。 您可以通过完成以下步骤来创建使用过期自定义映像的集群。
尝试创建 Dataproc 集群,其中包含过期的自定义映像或将在 10 天后过期的自定义映像。
gcloud dataproc clusters create cluster-name \ --image=custom-image-name \ --region=region \ ... other flags ...
gcloud
CLI 将发出包含集群dataproc:dataproc.custom.image.expiration.token
属性名称和令牌值的错误消息。dataproc:dataproc.custom.image.expiration.token=token value
将令牌值字符串复制到剪贴板。使用
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 ...
使用自定义映像创建集群应会成功。