使用 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/standarddatabricksruntime/minimal 不会与不相关的 databricks-standarddatabricks-minimal 环境混淆,这些环境包含在不再可用的带有 Conda 的 Databricks Runtime(Beta 版本)中。

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

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

若要从头开始生成你自己的映像,必须创建虚拟环境。 还必须包括 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 注册表应当也能正常工作。

注意

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

步骤 3:启动计算

你可以使用 UI 或 API 启动计算。

使用 UI 启动计算

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

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

  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. 使用 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 容器服务的计算时,系统将执行以下步骤:

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

Azure Databricks 会忽略 Docker CMDENTRYPOINT 基元。

使用机密进行身份验证

Databricks 容器服务支持使用机密进行身份验证。 创建计算资源时,使用 {{secrets/<scope-name>/<dcs-secret>}} 格式输入机密,而不是输入纯文本用户名或密码。 有关创建机密的信息,请参阅机密

启用容器服务

若要在计算中使用自定义容器,工作区管理员必须启用 Databricks 容器服务。

工作区管理员可以使用 Databricks CLI 启用 Databricks 容器服务。 在 JSON 请求正文中将 enableDcs 指定为 true,如以下示例所示:

databricks workspace-conf set-status \
--json '{"enableDcs": "true"}'