使用 Databricks 容器服务自定义容器

Databricks 容器服务允许你在创建群集时指定 Docker 映像。 一些示例用例包括:

  • 库自定义:你可以完全控制你要安装的系统库。
  • 黄金容器环境:你的 Docker 映像是锁定的环境,永远不会更改。
  • Docker CI/CD 集成:可以将 Azure Databricks 与 Docker CI/CD 管道集成。

你还可以使用 Docker 映像在具有 GPU 设备的群集上创建自定义深度学习环境。 若要进一步了解如何将 GPU 群集与 Databricks 容器服务配合使用,请参阅 GPU 群集上的 Databricks 容器服务

对于容器每次启动时要执行的任务,请使用初始化脚本

要求

注意

用于机器学习的 Databricks Runtime 不支持 Databricks 容器服务。

  • 你的 Azure Databricks 工作区必须已启用 Databricks 容器服务。
  • 你的计算机必须运行最新的 Docker 守护程序(一个经过测试的可与客户端/服务器版本 18.03.0-ce 一起使用的版本),并且 docker 命令必须在你的 PATH 上可用。

步骤 1:生成基础映像

Databricks 建议你根据 Databricks 已生成并测试的基础映像生成 Docker 基础映像。 还可以从头开始生成 Docker 基础映像。 本部分介绍两个选项。

选项 1. 使用 Databricks 生成的基础映像

此示例将 9.x 标记用于将面向运行时版本为 Databricks Runtime 9.0 及更高版本的群集的映像:

FROM databricksruntime/standard:9.x
...

若要指定其他 Python 库(例如最新版本的 pandas 和 urllib),请使用特定于容器的 pip 版本。 对于 datatabricksruntime/standard:9.x 容器,请包括以下内容:

RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3

对于 datatabricksruntime/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

注意

基础映像 databricksruntime/standarddatabricksruntime/minimal 不会与不相关的 databricks-standarddatabricks-minimal 环境混淆,这些环境包含在不再可用的带有 Conda 的 Databricks Runtime(Beta 版本)中。

选项 2. 生成你自己的 Docker 基础映像

你还可以从头开始生成 Docker 基础映像。 Docker 映像必须满足以下要求:

若要从头开始生成你自己的映像,必须创建虚拟环境。 还必须包含内置于 Databricks 群集中的包,如 Python、R 和 Ganglia。 若要开始,可以使用适当的基础映像(即适用于 R 的 databricksruntime/rbase 或适用于 Python 的 databricksruntime/python),或参阅 GitHub 中的示例 Dockerfile。 另一种替代方法是从 Databricks 在 databricksruntime/minimal 生成的最小映像着手。

注意

Databricks 建议使用 Ubuntu Linux,但你可以使用 Alpine Linux。 若要使用 Alpine Linux,必须包括以下文件:

此外,还必须设置 Python,如此示例 Dockerfile 所示。

警告

在 Azure Databricks 群集上全面测试自定义容器映像。 容器可在本地计算机或生成计算机上运行,但当容器在 Azure Databricks 群集上启动时,群集启动可能会失败,某些功能可能会被禁用,或者容器可能会停止工作,甚至无提示。 最糟糕的情况是,它可能会损坏你的数据,或者意外地向外部方公开你的数据。

步骤 2:推送基础映像

将自定义基础映像推送到 Docker 注册表。 以下注册表支持此过程:

其他支持无身份验证或基本身份验证的 Docker 注册表应当也能正常工作。

注意

如果将 Docker Hub 用于 Docker 注册表,请务必检查速率限制是否可容纳你预计在 6 小时内启动的群集数。 对于匿名用户、没有付费订阅的经过身份验证的用户和付费订阅,这些费率限制有所不同。 有关详细信息,请参阅 Docker 文档。 如果超出此限制,你将收到“429 请求过多”响应。

步骤 3:启动群集

你可以使用 UI 或 API 启动群集。

使用 UI 启动群集

  1. “创建群集”页上,指定支持 Databricks 容器服务的 Databricks Runtime 版本。

  2. 在“高级选项”下,选择“Docker”选项卡。

    选择 Databricks 运行时

  3. 选择“使用自己的 Docker 容器”。

  4. 在“Docker 映像 URL”字段中,输入你的自定义 Docker 映像。

    Docker 映像 URL 示例:

    注册表 标记格式
    Docker Hub <organization>/<repository>:<tag>(例如:databricksruntime/standard:latest
    Azure 容器注册表 <your-registry-name>.azurecr.io/<repository-name>:<tag>
  5. 选择身份验证类型。

使用 API 启动群集

  1. 生成 API 令牌

  2. 使用群集 API 2.0 启动包含自定义 Docker 基础映像的群集。

    curl -X POST -H "Authorization: Bearer <token>" https://<databricks-instance>/api/2.0/clusters/create -d '{
      "cluster_name": "<cluster-name>",
      "num_workers": 0,
      "node_type_id": "Standard_DS3_v2",
      "docker_image": {
        "url": "databricksruntime/standard:latest",
        "basic_auth": {
          "username": "<docker-registry-username>",
          "password": "<docker-registry-password>"
        }
      },
      "spark_version": "7.3.x-scala2.12",
    }'
    

    basic_auth 要求取决于你的 Docker 映像类型:

    • 对于公共 Docker 映像,不要包括 字段。
    • 对于专用 Docker 映像,必须包括 basic_auth 字段,使用服务主体 ID 和密码作为用户名和密码。
    • 对于 Azure 容器注册表,必须将 basic_auth 字段设置为服务主体的 ID 和密码。 请参阅 Azure 容器注册表服务主体身份验证文档,了解如何创建服务主体。

使用初始化脚本

Databricks 容器服务群集允许客户在 Docker 容器中包括初始化脚本。 在大多数情况下,应避免使用初始化脚本,而应直接通过 Docker(使用 Dockerfile)进行自定义。 但是,某些任务必须在容器启动时执行,而不是在构建容器时执行。 请为这些任务使用初始化脚本。

例如,假设要在自定义容器中运行安全守护程序。 通过映像生成管道在 Docker 映像中安装并生成守护程序。 然后,添加启动守护程序的初始化脚本。 在此示例中,初始化脚本将包含一个类似于 systemctl start my-daemon 的行。

在 API 中,你可以将初始化脚本指定为群集规范的一部分,如下所示。 有关详细信息,请参阅 InitScriptInfo

"init_scripts": [
    {
        "file": {
            "destination": "file:/my/local/file.sh"
        }
    }
]

对于 Databricks 容器服务映像,你还可以将初始化脚本存储在 DBFS 或云存储中。

启动 Databricks 容器服务群集时,将执行以下步骤:

  1. 从云提供商处获取 VM。
  2. 从你的存储库中下载自定义 Docker 映像。
  3. Azure Databricks 基于映像创建 Docker 容器。
  4. Databricks Runtime 代码复制到 Docker 容器中。
  5. 执行初始化脚本。 请参阅初始化脚本执行顺序

Azure Databricks 会忽略 Docker CMDENTRYPOINT 基元。