使用 Databricks 容器服务自定义容器
Databricks 容器服务允许在创建计算时指定 Docker 映像。 一些示例用例包括:
- 库自定义:你可以完全控制你要安装的系统库。
- 黄金容器环境:你的 Docker 映像是锁定的环境,永远不会更改。
- Docker CI/CD 集成:可以将 Azure Databricks 与 Docker CI/CD 管道集成。
还可以使用 Docker 映像在具有 GPU 设备的计算上创建自定义深度学习环境。 若要进一步了解如何将 GPU 计算与 Databricks 容器服务配合使用,请参阅 GPU 计算上的 Databricks 容器服务。
对于容器每次启动时要执行的任务,请使用初始化脚本。
要求
- 你的 Azure Databricks 工作区必须已启用 Databricks 容器服务。
- 你的计算机必须运行最新的 Docker 守护程序(一个经过测试的可与客户端/服务器版本 18.03.0-ce 一起使用的版本),并且
docker
命令必须在你的PATH
上可用。
限制
- 使用共享访问模式的计算不支持 Databricks 容器服务。
- 用于机器学习的 Databricks Runtime 不支持 Databricks 容器服务。
- 若要访问 Databricks 容器服务上的卷,请将以下配置添加到相应计算的“Spark 配置”字段:
spark.databricks.unityCatalog.volumes.enabled true
。
步骤 1:生成基础映像
Databricks 建议你根据 Databricks 已生成并测试的基础映像生成 Docker 基础映像。 还可以从头开始生成 Docker 基础映像。 本部分介绍两个选项。
选项 1. 使用 Databricks 生成的基础映像
此示例为映像使用的 9.x
标记将面向具有 Databricks Runtime 9.1 LTS 及更高运行时版本的计算:
FROM databricksruntime/standard:9.x
...
若要指定其他 Python 库(例如最新版本的 pandas 和 urllib),请使用特定于容器的 pip
版本。 对于 databricksruntime/standard:9.x
容器,请包括以下内容:
RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3
对于 databricksruntime/standard:8.x
或较低版本的容器,请包括以下内容:
RUN /databricks/conda/envs/dcs-minimal/bin/pip install pandas
RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3
基础映像将托管在 https://hub.docker.com/u/databricksruntime 中 Docker Hub 上。 用来生成这些基础映像的 Dockerfile 位于 https://github.com/databricks/containers。
注意
将修补带有“-LTS”后缀标记的 Docker Hub 托管映像。 其他所有映像都是示例,不会定期修补。
注意
基础映像 databricksruntime/standard
和 databricksruntime/minimal
不会与不相关的 databricks-standard
和 databricks-minimal
环境混淆,这些环境包含在不再可用的带有 Conda 的 Databricks Runtime(Beta 版本)中。
选项 2. 生成你自己的 Docker 基础映像
你还可以从头开始生成 Docker 基础映像。 Docker 映像必须满足以下要求:
- 系统
PATH
上的 Java 为 JDK 8u191 - bash
- iproute2 (ubuntu iproute)
- coreutils (ubuntu coreutils)
- procps (ubuntu procps)
- sudo (ubuntu sudo)
- Ubuntu Linux
若要从头开始生成你自己的映像,必须创建虚拟环境。 还必须包括 Databricks 计算中内置的包,例如 Python 和 R。若要开始,可以使用相应的基础映像:
- R 模型:
databricksruntime/rbase
- Python 模型:
databricksruntime/python
- 对于 Databricks 生成的最小映像:
databricksruntime/minimal
还可以参考 GitHub 中的 Dockerfile 示例。
注意
Databricks 建议使用 Ubuntu Linux,但你可以使用 Alpine Linux。 若要使用 Alpine Linux,必须包括以下文件:
此外,还必须设置 Python,如此示例 Dockerfile 所示。
警告
在 Azure Databricks 计算中全面测试自定义容器映像。 容器可以在本地或生成计算机上工作,但在 Azure Databricks 上启动容器时,计算启动可能会失败,某些功能可能会禁用,或者容器可能会停止工作(甚至是无提示的)。 最糟糕的情况是,它可能会损坏你的数据,或者意外地向外部方公开你的数据。
步骤 2:推送基础映像
将自定义基础映像推送到 Docker 注册表。 以下注册表支持此过程:
- 无身份验证或基本身份验证的 Docker Hub。
- 具有基础身份验证的 Azure 容器注册表。
其他支持无身份验证或基本身份验证的 Docker 注册表应当也能正常工作。
注意
如果为 Docker 注册表使用 Docker Hub,请务必检查速率限制是否适合预期在 6 小时内启动的计算量。 对于匿名用户、没有付费订阅的经过身份验证的用户和付费订阅,这些费率限制有所不同。 有关详细信息,请参阅 Docker 文档。 如果超出此限制,你将收到“429 请求过多”响应。
步骤 3:启动计算
你可以使用 UI 或 API 启动计算。
使用 UI 启动计算
在“创建计算”页面上,指定支持 Databricks 容器服务的 Databricks Runtime 版本。
在“高级选项”下,选择“Docker”选项卡。
选择“使用自己的 Docker 容器”。
在“Docker 映像 URL”字段中,输入你的自定义 Docker 映像。
Docker 映像 URL 示例:
注册表 标记格式 Docker Hub <organization>/<repository>:<tag>
(例如:databricksruntime/standard:latest
)Azure 容器注册表 <your-registry-name>.azurecr.io/<repository-name>:<tag>
选择身份验证类型。 可使用机密来存储用户名和密码身份验证值。 请参阅使用机密进行身份验证。
使用 API 启动计算
使用 Databricks CLI 通过自定义 Docker 基础映像启动计算。
databricks clusters create \ --cluster-name <cluster-name> \ --node-type-id Standard_DS3_v2 \ --json '{ "num_workers": 0, "docker_image": { "url": "databricksruntime/standard:latest", "basic_auth": { "username": "<docker-registry-username>", "password": "<docker-registry-password>" } }, "spark_version": "14.3.x-scala2.12" }'
basic_auth
要求取决于你的 Docker 映像类型:- 对于公共 Docker 映像,不要包括 字段。
- 对于专用 Docker 映像,必须包括
basic_auth
字段,使用服务主体 ID 和密码作为用户名和密码。 - 对于 Azure 容器注册表,必须将
basic_auth
字段设置为服务主体的 ID 和密码。 请参阅 Azure 容器注册表服务主体身份验证文档,了解如何创建服务主体。 - 还可使用机密来存储身份验证信息。 请参阅使用机密进行身份验证。
使用初始化脚本
Databricks 容器服务使客户能够在 Docker 容器中包含 init 脚本。 在大多数情况下,应避免使用初始化脚本,而应直接通过 Docker(使用 Dockerfile)进行自定义。 但是,某些任务必须在容器启动时执行,而不是在构建容器时执行。 请为这些任务使用初始化脚本。
例如,假设要在自定义容器中运行安全守护程序。 通过映像生成管道在 Docker 映像中安装并生成守护程序。 然后,添加启动守护程序的初始化脚本。 在此示例中,初始化脚本将包含一个类似于 systemctl start my-daemon
的行。
在 API 中,可以将 init 脚本指定为计算规范的一部分,如下所示。 有关详细信息,请参阅群集 API。
"init_scripts": [
{
"file": {
"destination": "file:/my/local/file.sh"
}
}
]
对于 Databricks 容器服务映像,还可以将初始化脚本存储在云存储中。
启动使用 Databricks 容器服务的计算时,系统将执行以下步骤:
- 从云提供商处获取 VM。
- 从你的存储库中下载自定义 Docker 映像。
- Azure Databricks 基于映像创建 Docker 容器。
- Databricks Runtime 代码复制到 Docker 容器中。
- 执行 init 脚本。 请参阅什么是 init 脚本?。
Azure Databricks 会忽略 Docker CMD
和 ENTRYPOINT
基元。
使用机密进行身份验证
Databricks 容器服务支持使用机密进行身份验证。 创建计算资源时,使用 {{secrets/<scope-name>/<dcs-secret>}}
格式输入机密,而不是输入纯文本用户名或密码。 有关创建机密的信息,请参阅 “管理机密”。
启用容器服务
若要在计算中使用自定义容器,工作区管理员必须启用 Databricks 容器服务。
工作区管理员可以使用 Databricks CLI 启用 Databricks 容器服务。 在 JSON 请求正文中将 enableDcs
指定为 true
,如以下示例所示:
databricks workspace-conf set-status \
--json '{"enableDcs": "true"}'