使用Databricks Container Services定制容器

Databricks Container Services允许您在创建集群时指定Docker映像。一些示例用例包括:

  • 库定制:您可以完全控制想要安装的系统库。

  • 黄金容器环境:Docker映像是一个永远不会改变的锁定环境。

  • Docker CI/CD集成:您可以将Databricks集成到Docker CI/CD管道中。

您还可以使用Docker映像在具有GPU设备的集群上创建自定义深度学习环境。有关在Databricks容器服务中使用GPU集群的其他信息,请参见Databricks Container GPU集群的服务

对于每次容器启动时执行的任务,使用init脚本

需求

请注意

Databricks运行时机器学习不支持Databricks容器服务。

  • 您的Databricks工作区必须具有Databricks容器服务启用

  • 您的计算机必须正在运行最新的Docker守护进程(已经过测试并可用于客户端/服务器版本18.03.0-ce)和码头工人命令必须在您的路径

第一步:建立你的基础

Databricks建议您从Databricks已经构建和测试过的基础上构建Docker库。你也可以从头开始构建Docker基础。介绍两种选项。

选项1。使用Databricks构建的数据库

本例使用9.倍标签,将目标集群的运行时版本Databricks runtime 9.0及以上:

从databricksruntime /标准:9。x……

要指定其他Python库,例如最新版本的pandas和urllib,请使用容器特定版本的皮普.为datatabricksruntime /标准:9. x容器,包括以下内容:

RUN /databricks/python3/bin/pip install pandas

datatabricksruntime /标准:8. x容器或更低的容器,包括:

RUN /databricks/conda/envs/dcs-minimal/bin/pip install urllib3 . RUN /databricks/conda/envs/dcs-minimal/bin/pip

基本映像托管在Docker Hub上https://hub.docker.com/u/databricksruntime.用于生成这些基的dockerfile位于https://github.com/databricks/containers

请注意

Docker Hub托管的带有“-LTS”后缀标签的图像将被修补。所有其他图像都是示例,不定期修补。

请注意

基本图像databricksruntime /标准而且databricksruntime /最小是不是要跟无关的人搞混了databricks-standard而且databricks-minimal在不再可用的Databricks Runtime with Conda (Beta)中包含的环境。

第二个选项。建立自己的Docker基础

您还可以从头开始构建Docker基础。Docker镜像必须满足以下要求:

要从头构建自己的映像,必须创建虚拟环境。你还必须包含内置在Databricks集群中的包,比如Python和r。要开始,你可以使用适当的基本映像:

  • R:databricksruntime / rbase

  • Python:databricksruntime / python

  • 对于Databricks构建的最小图像:databricksruntime /最小

您也可以参考示例GitHub中的Dockerfiles

请注意

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

此外,您必须设置Python,如下所示例子Dockerfile

警告

在Databricks集群上彻底测试您的自定义容器映像。您的容器可以在本地或构建机器上工作,但是当您的容器在Databricks集群上启动时,集群启动可能会失败,某些特性可能会被禁用,或者容器可能会停止工作,甚至是无声地停止工作。在最坏的情况下,它可能破坏您的数据或意外地将您的数据暴露给外部方。

作为提醒,您对Databricks容器服务的使用受服务特定条款

第二步:推送你的基本图片

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

其他不支持认证或基本认证的Docker注册表也有望工作。

请注意

如果您在Docker注册表中使用Docker Hub,请务必检查速率限制,以适应您预计在6小时内启动的集群数量。这些速率限制对于匿名用户、没有付费订阅的已验证用户和付费订阅是不同的。看到Docker文档获取详细信息。如果超过这个限制,您将得到“429 Too Many Requests”响应。

步骤3:启动集群

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

使用UI启动集群

  1. 创建集群页面,指定支持Databricks容器服务的Databricks运行时版本。

  2. 高级选项,选择码头工人选项卡。

    选择Databricks runtime
  3. 选择使用您自己的Docker容器

  4. Docker图片URL字段,输入自定义Docker映像。

    Docker镜像URL示例:

    注册表

    标签格式

    码头工人中心

    <组织> / <库>:<标记>(例如:databricksruntime /标准:最新

    亚马逊ECR

    < aws-account-id > .dkr.ecr。<地区> .amazonaws.com/ <库>:<标记>

    Azure容器注册中心

    < your-registry-name > .azurecr.io / <存储库名>:<标记>

  5. 选择认证类型。

使用API启动集群

  1. 生成一个API令牌

  2. 使用集群API 2.0使用自定义Docker基础启动集群。

    curl -X POST -H"授权:持有者<令牌>"https:// < databricks-instance > / api / 2.0 /集群/创建- d”{:“cluster_name <集群名称>”,“num_workers”:0,:“node_type_id i3.xlarge”," docker_image ": {“url”:“最新databricksruntime /标准:”," basic_auth ": {“用户名”:“< docker-registry-username >”,“密码”:“< docker-registry-password >”},:“spark_version 7.3.x-scala2.12”," aws_attributes ": {“可用性”:“ON_DEMAND”,:“instance_profile_arn攻击:aws:我::< aws-account-number >: instance-profile / < iam-role-name >”} '

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

    • 对于公共Docker映像,包括basic_auth字段。

    • 对于私有Docker映像,必须包含basic_auth字段,使用服务主体ID和密码作为用户名和密码。

    • 对于Azure容器注册表,必须设置basic_auth字段转换为服务主体的ID和密码。看到Azure容器注册中心服务主体身份验证文档有关创建服务主体的信息。

    • 对于Amazon ECR图像,不包括basic_auth字段。您必须使用实例配置文件包括从镜像所在的Docker存储库中提取Docker镜像的权限。要做到这一点,请遵循步骤3和步骤4使用实例配置文件建立对S3桶的安全访问

      下面是一个IAM角色的示例,该角色具有提取任何图像的权限。存储库由< arn-of-repository >

      “版本”“2012-10-17”“声明”“效应”“允许”“行动”“ecr: GetAuthorizationToken”],“资源”“*”},“效应”“允许”“行动”“ecr: BatchCheckLayerAvailability”“ecr: GetDownloadUrlForLayer”“ecr: GetrepositoryPolicy”“ecr: DescribeRepositories”“ecr: ListImages”“ecr: DescribeImages”“ecr: BatchGetImage”],“资源”“< arn-of-repository >”

      如果Amazon ECR映像驻留在与Databricks集群不同的AWS帐户中,则使用ECR存储库策略除了集群实例配置文件,授予Databricks集群访问权限。下面是一个ECR存储库策略的示例。集群实例配置文件所承担的IAM角色由< arn-of-IAM-role >

      “版本”“2012-10-17”“声明”[{“席德”“AllowCrossAccountPush”“效应”“允许”“校长”“AWS”“< arn-of-IAM-role >”},“行动”“ecr: BatchCheckLayerAvailability”“ecr: BatchGetImage”“ecr: DescribeImages”“ecr: DescribeRepositories”“ecr: GetDownloadUrlForLayer”“ecr: GetrepositoryPolicy”“ecr: ListImages”})

使用初始化脚本

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

例如,假设您想在自定义容器中运行安全守护进程。通过映像构建管道在Docker映像中安装和构建守护进程。然后,添加启动守护进程的init脚本。在本例中,init脚本将包含如下一行systemctl开始my-daemon

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

“init_scripts”“文件”“目的地”“文件:/我的/地方/ file.sh”

对于Databricks Container Services映像,还可以将初始化脚本存储在DBFS或云存储中。

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

  1. 虚拟机从云提供商处获取。

  2. 自定义Docker映像从您的repo中下载。

  3. Databricks根据映像创建一个Docker容器。

  4. Databricks运行时代码被复制到Docker容器中。

  5. 执行init脚本。看到初始化脚本执行顺序

Databricks忽略DockerCMD而且入口点原语。