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

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

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

你还可以使用 Docker 映像在具有 GPU 设备的群集上创建自定义深度学习环境。 有关将 GPU 群集与 Databricks 容器服务一起使用的其他信息,请参阅 gpu 群集上的 Databricks 容器服务

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

要求

注意

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

  • Databricks Runtime 6.1 或更高版本。 如果你以前使用过 Databricks 容器服务,则必须升级基础映像。 查看用标记的中的最新映像 https://github.com/databricks/containers6.x
  • 你的 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。 若要开始,可以使用适用 databricksruntime/rbase 于 R 或 Python) (的相应基本映像, databricksruntime/python 或参阅databricksruntime/rbase的示例 dockerfile。 另一种替代方法是从 Databricks 生成的最小映像开始 databricksruntime/minimal

注意

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

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

警告

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

步骤 2:推送基础映像

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

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

步骤 3:启动群集

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

使用 UI 启动群集

  1. 指定支持 Databricks 容器服务的 Databricks Runtime 版本。

    Select Databricks runtime

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

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

    Docker 映像 URL 示例:

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

使用 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 基元。