Customize containers with Databricks Container サービス
Databricks Container Services では、コンピュートを作成するときに Dockerイメージを指定できます。 使用例には、次のようなものがあります。
- ライブラリのカスタマイズ: インストールするシステムライブラリを完全に制御できます。
- ゴールデンコンテナー環境: Dockerイメージはロックダウンされた環境で、変化することはありません。
- Docker CI/CD統合: DatabricksはDocker CI/CDパイプラインと統合できます。
また、 Dockerイメージを使用して、GPU デバイスを搭載したコンピュート上にカスタムのディープラーニング環境を作成することもできます。 GPU コンピュートと Databricks Container Servicesの使用に関する追加情報については、「GPU コンピュートDatabricks Container Services」を参照してください。
コンテナが起動するたびにタスクを実行するには、 initスクリプトを使用します。
必要条件
- Databricks ワークスペースで Databricks Container Services が有効になっている必要があります。
- マシンは、最新のDockerデーモン(テスト済みで、クライアント/サーバーバージョン18.03.0-ceで動作するデーモン)を実行している必要があります。また、
docker
コマンドをPATH
で使用できる必要があります。
制限
-
Databricks Container Services は、標準アクセス モード (以前の共有アクセス モード) を使用するコンピュートではサポートされていません。
-
機械学習用Databricks Runtimeは、Databricks Container Servicesをサポートしていません。
-
Databricks Container Services上のボリュームにアクセスするには、コンピュートの Spark設定 フィールドに次の設定を追加します。
spark.databricks.unityCatalog.volumes.enabled true
。 -
Databricks Container Services は、AWS Graviton インスタンスタイプではサポートされていません。
ステップ1:ベースを構築する
Databricksでは、Databricksで構築およびテストされたベースからDockerベースを構築することをおすすめします。Dockerベースをゼロから構築することも可能です。このセクションでは、これらの2つの方法について説明します。
オプション1.Databricks によって構築されたベースを使用する
この例では、ランタイム バージョン Databricks Runtime 9.1 LTS 以降のコンピュートを対象とするイメージに 9.x
タグを使用します。
FROM databricksruntime/standard:9.x
...
最新バージョンのpandasやurllibなどの追加のPythonライブラリを指定するには、コンテナー固有のバージョンの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
ベースイメージはDocker Hub(https://hub.docker.com/u/databricksruntime)でホストされます。これらのベースを生成するために使用されるDockerfileはhttps://github.com/databricks/containersにあります。
サフィックスが「-LTS」であるタグが付いたDocker Hubでホストされているイメージにはパッチが適用されます。他のすべてのイメージは例であり、定期的にパッチが適用されているわけではありません。
ベースイメージdatabricksruntime/standard
およびdatabricksruntime/minimal
は、すでに使用できないDatabricks Runtime with Conda(ベータ版)に含まれているdatabricks-standard
およびdatabricks-minimal
環境とは関係ないので、混同しないでください。
オプション2.独自のDockerベースを構築
Dockerベースはゼロから構築することもできます。Docker イメージは、次の要件を満たしている必要があります。
- システム上のJavaとしてのJDK 8u191
PATH
- bash
- iproute2(ubuntu iproute)
- coreutils(ubuntu coreutils)
- procps(ubuntu procps)
- sudo(ubuntu sudo)
- Ubuntu Linux
独自のイメージをゼロから構築するには、仮想環境を作成する必要があります。 また、 や R Databricksなど、 コンピュートに組み込まれているパッケージも含める必要があります。開始するには、適切な基本イメージを使用できます。Python
- Rの場合:
databricksruntime/rbase
- Pythonの場合:
databricksruntime/python
- Databricksによって構築された最小限のイメージの場合:
databricksruntime/minimal
GitHubのDockerfilesの例を参照することもできます。
DatabricksはUbuntu Linuxの使用をおすすめしています。ただし、Alpine Linuxを使用することは可能です。Alpine Linuxを使用するには、次のファイルを含める必要があります。
さらに、このDockerfileの例に示すように、Pythonをセットアップする必要があります。
カスタム コンテナ イメージを Databricks コンピュートで徹底的にテストします。 コンテナはローカルマシンまたはビルドマシンで動作する場合がありますが、コンテナが Databricks で起動されると、コンピュートの起動に失敗したり、特定の機能が無効になったり、コンテナがサイレントであっても動作しなくなったりする可能性があります。 最悪の場合、データが破損したり、誤ってデータを外部に公開したりする可能性があります。
ステップ 2: 基本イメージをプッシュする
カスタムベースイメージをDockerレジストリにプッシュします。このプロセスは、次のレジストリでサポートされています。
- 認証や基本認証のないDocker ハブ。
- IAMを使用するAmazon Elastic Container Registry(Amazon ECR)(ただしCommercial Cloud Services(C2S)を除く)。
- 基本認証を使用するAzureコンテナーレジストリ。
認証や基本認証をサポートしない他のDockerレジストリも動作することが想定されます。
Docker HubDockerレジストリに を使用している場合は、レート制限が 6 時間後に開始される予定のコンピュートの量に対応していることを確認してください。これらのレート制限は、匿名ユーザー、有料サブスクリプションのない認証済みユーザー、および有料サブスクリプションで異なります。 詳細については 、Docker のドキュメント を参照してください。 この制限を超えると、「429 Too Many Requests」というレスポンスが返されます。
ステップ3:コンピュートを起動する
コンピュートは、UIまたは APIを使用して起動できます。
UIを使用してコンピュートを起動します
-
[コンピュートの作成] ページで Databricks RuntimeDatabricks Container Services、 をサポートする バージョンを指定します。
-
[詳細設定] で、[ Docker ] タブを選択します。
-
[ 自分のDockerコンテナを使用する ]を選択します。
-
[ DockerイメージURL ]フィールドに、カスタムDockerイメージを入力します。
DockerイメージURLの例:
レジストリ タグの形式 Dockerハブ <organization>/<repository>:<tag>
(例:databricksruntime/standard:latest
)Amazon ECR <aws-account-id>.dkr.ecr.<region>.amazonaws.com/<repository>:<tag>
Azure Container Registry <your-registry-name>.azurecr.io/<repository-name>:<tag>
-
認証タイプを選択します。 シークレットを使用して、ユーザー名とパスワードの認証値を保存できます。 「認証にシークレットを使用する」を参照してください。
APIを使用してコンピュートを起動します
-
Databricks CLIを使用して、カスタムDockerベースでコンピュートを起動します。
Bashdatabricks clusters create \
--cluster-name <cluster-name> \
--node-type-id i3.xlarge \
--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",
"aws_attributes": {
"availability": "ON_DEMAND",
"instance_profile_arn": "arn:aws:iam::<aws-account-number>:instance-profile/<iam-role-name>"
}
}'basic_auth
要件は、Dockerイメージの種類によって異なります。-
パブリックDockerイメージの場合は、
basic_auth
フィールドを含め ないでください 。 -
プライベートDockerイメージの場合は、
basic_auth
フィールドを追加し、ユーザー名とパスワードとしてサービスプリンシパルのIDとパスワードを使用する必要があります。 -
Azure Container Registryの場合は、
basic_auth
フィールドをサービスプリンシパルのIDとパスワードに設定する必要があります。サービスプリンシパルの作成については、Azure Container Registryのサービスプリンシパル認証に関するドキュメントを参照してください。 -
Amazon ECR イメージの場合は、
basic_auth
フィールドを含めないでください。 コンピュートは、イメージが存在するDockerリポジトリからイメージをプルする権限を含む インスタンスプロファイル を使用してDocker 起動する必要があります。これを行うには、 インスタンスプロファイルを使用して S3 バケットへの安全なアクセスを設定するプロセスのステップ 3 と 4 に従います。 -
シークレットを使用して認証情報を保存することもできます。 「認証にシークレットを使用する」を参照してください。
任意のイメージをプルする権限を持つIAMロールの例を次に示します。リポジトリは
<arn-of-repository>
で指定されます。JSON{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ecr:GetAuthorizationToken"],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetrepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage"
],
"Resource": ["<arn-of-repository>"]
}
]
}ECRイメージがAWS Databricksコンピュートとは異なる アカウントにある場合は、コンピュート インスタンスプロファイルに加えてECR リポジトリポリシー を使用して、コンピュート アクセスを許可します。以下は、ECR リポジトリポリシーの例です。 コンピュートのインスタンスプロファイルが引き受ける IAMロールは、
<arn-of-IAM-role>
で指定します。JSON{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPush",
"Effect": "Allow",
"Principal": {
"AWS": "<arn-of-IAM-role>"
},
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:DescribeImages",
"ecr:DescribeRepositories",
"ecr:GetDownloadUrlForLayer",
"ecr:GetrepositoryPolicy",
"ecr:ListImages"
]
}
]
}
-
initスクリプトを使用する
Databricks Container Services 、顧客が Docker コンテナにinitスクリプトを含めることができるようにします。 ほとんどの場合、initスクリプトを避け、代わりに Docker を直接(Dockerfileを使用して)カスタマイズする必要があります。 ただし、特定のタスクは、コンテナがビルドされるときではなく、コンテナの開始時に実行する必要があります。 これらのタスクにはinitスクリプトを使用します。
たとえば、カスタムコンテナー内でセキュリティデーモンを実行するとします。イメージ構築パイプラインを使用して、Dockerイメージにデーモンをインストールしてビルドします。次に、デーモンを起動するinitスクリプトを追加します。この例では、initスクリプトに「systemctl start my-daemon
」のような行が含まれます。
APIでは、次のようにコンピュート仕様の一部としてinitスクリプトを指定できます。詳細については、 クラスタリング APIを参照してください。
"init_scripts": [
{
"file": {
"destination": "file:/my/local/file.sh"
}
}
]
Databricks Container Servicesイメージの場合は、initスクリプトをクラウドストレージに保存することもできます。
次の手順は、 Databricks Container Servicesを使用するコンピュートを起動するときに実行されます。
- VMはクラウドプロバイダーから取得されます。
- カスタムDockerイメージはリポジトリからダウンロードされます。
- Databricksは、イメージからDockerコンテナーを作成します。
- Databricks RuntimeコードがDockerコンテナーにコピーされます。
- initスクリプトが実行されます。 「initスクリプトとは」を参照してください。
DatabricksはDockerのCMD
およびENTRYPOINT
プリミティブを無視します。
認証にシークレットを使用する
Databricks Container サービス は、認証にシークレットを使用することをサポートしています。 コンピュート リソースを作成するときは、プレーン テキストのユーザー名やパスワードを入力する代わりに、 {{secrets/<scope-name>/<dcs-secret>}}
形式でシークレットを入力します。 シークレットの作成に関する情報については、「 シークレットの管理」を参照してください。
コンテナサービスの有効化
コンピュートでカスタムコンテナを使用するには、ワークスペース管理者が Databricks Container Servicesを有効にする必要があります。
ワークスペース 管理者は、 を使用してDatabricks Container サービスを有効にすることができます。DatabricksCLIJSON リクエスト本文で、次の例のように enableDcs
を true
に指定します。
databricks workspace-conf set-status \
--json '{"enableDcs": "true"}'