使用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镜像必须满足以下要求:
在系统上使用JDK 8u191作为Java
路径
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 /最小
您也可以参考示例GitHub中的Dockerfiles.
请注意
Databricks建议使用Ubuntu Linux;但是,可以使用Alpine Linux。要使用Alpine Linux,必须包含以下文件:
此外,您必须设置Python,如下所示例子Dockerfile.
警告
在Databricks集群上彻底测试您的自定义容器映像。您的容器可以在本地或构建机器上工作,但是当您的容器在Databricks集群上启动时,集群启动可能会失败,某些特性可能会被禁用,或者容器可能会停止工作,甚至是无声地停止工作。在最坏的情况下,它可能破坏您的数据或意外地将您的数据暴露给外部方。
作为提醒,您对Databricks容器服务的使用受服务特定条款.
第二步:推送你的基本图片
将您的自定义基映像推到Docker注册表。以下注册表支持此过程:
码头工人中心没有认证或基本认证。
Amazon Elastic Container Registry (Amazon ECR)IAM(商业云服务(C2S)除外)。
Azure容器注册中心基本认证。
其他不支持认证或基本认证的Docker注册表也有望工作。
请注意
如果您在Docker注册表中使用Docker Hub,请务必检查速率限制,以适应您预计在6小时内启动的集群数量。这些速率限制对于匿名用户、没有付费订阅的已验证用户和付费订阅是不同的。看到Docker文档获取详细信息。如果超过这个限制,您将得到“429 Too Many Requests”响应。
步骤3:启动集群
您可以使用UI或API启动集群。
使用UI启动集群
在创建集群页面,指定支持Databricks容器服务的Databricks运行时版本。
下高级选项,选择码头工人选项卡。
选择使用您自己的Docker容器.
在Docker图片URL字段,输入自定义Docker映像。
Docker镜像URL示例:
注册表
标签格式
码头工人中心
<组织> / <库>:<标记>
(例如:databricksruntime /标准:最新
)亚马逊ECR
< aws-account-id > .dkr.ecr。<地区> .amazonaws.com/ <库>:<标记>
Azure容器注册中心
< your-registry-name > .azurecr.io / <存储库名>:<标记>
选择认证类型。
使用API启动集群
使用集群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容器服务集群时,将执行以下步骤:
虚拟机从云提供商处获取。
自定义Docker映像从您的repo中下载。
Databricks根据映像创建一个Docker容器。
Databricks运行时代码被复制到Docker容器中。
执行init脚本。看到初始化脚本执行顺序.
Databricks忽略DockerCMD
而且入口点
原语。