メインコンテンツまでスキップ

Databricks コンテナ サービスによるコンテナのカスタマイズ

Databricksコンテナサービスでは、コンピュートを作成するときに Dockerイメージを指定できます。 使用例には、次のようなものがあります。

  • ライブラリのカスタマイズ: インストールするシステムライブラリを完全に制御できます。
  • ゴールデンコンテナー環境: Dockerイメージはロックダウンされた環境で、変化することはありません。
  • Docker CI/CD統合: DatabricksはDocker CI/CDパイプラインと統合できます。

また、 Dockerイメージを使用して、GPU デバイスを搭載したコンピュート上にカスタムのディープラーニング環境を作成することもできます。 GPU コンピュートと Databricks コンテナサービスの使用に関する追加情報については、GPU コンピュートにおけるDatabricksコンテナサービスを参照してください。

コンテナが起動するたびにタスクを実行するには、 initスクリプトを使用します。

必要条件

  • Databricks ワークスペースで Databricksコンテナサービスが有効になっている必要があります。
  • マシンは、最新のDockerデーモン(テスト済みで、クライアント/サーバーバージョン18.03.0-ceで動作するデーモン)を実行している必要があります。また、dockerコマンドをPATHで使用できる必要があります。

制限

  • Databricksコンテナサービスは、標準アクセス モード (以前の共有アクセス モード) を使用するコンピュートではサポートされていません。

  • 機械学習用Databricks Runtimeは、Databricksコンテナサービスをサポートしていません。

  • Databricks Container Services上のボリュームにアクセスするには、コンピュートの Spark 設定 フィールドに spark.databricks.unityCatalog.volumes.enabled trueの設定を追加します。

  • 172.17.0.0/16 は、Docker で使用されるデフォルトの IP 範囲です。 IP の競合による接続の問題を防ぐには、このサブネットにリソースを設定しないでください。

  • Databricksコンテナサービスは、AWS Graviton インスタンスタイプではサポートされていません。

ステップ1:ベースを構築する

Databricksでは、Databricksで構築およびテストされたベースからDockerベースを構築することをおすすめします。Dockerベースをゼロから構築することも可能です。このセクションでは、これらの2つの方法について説明します。

オプション1.Databricks によって構築されたベースを使用する

この例では、ランタイム バージョン Databricks Runtime 9.1 LTS 以降のコンピュートを対象とするイメージに 9.x タグを使用します。

Bash
FROM databricksruntime/standard:9.x
...

最新バージョンのpandasやurllibなどの追加のPythonライブラリを指定するには、コンテナー固有のバージョンのpipを使用します。databricksruntime/standard:9.xコンテナーの場合は、次のものを指定します。

Bash
RUN /databricks/python3/bin/pip install pandas
RUN /databricks/python3/bin/pip install urllib3

databricksruntime/standard:8.x以下のコンテナーの場合は、次のものを指定します。

Bash
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 イメージは、次の要件を満たしている必要があります。

独自のイメージをゼロから構築するには、仮想環境を作成する必要があります。 また、Pythonや Rなど、Databricks コンピュートに組み込まれているパッケージも含める必要があります。開始するには、適切な基本イメージを使用できます。

  • 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レジストリも動作することが想定されます。

注記

Docker HubDockerレジストリに を使用している場合は、レート制限が 6 時間後に開始される予定のコンピュートの量に対応していることを確認してください。これらのレート制限は、匿名ユーザー、有料サブスクリプションのない認証済みユーザー、および有料サブスクリプションで異なります。 詳細については 、Docker のドキュメント を参照してください。 この制限を超えると、「429 Too Many Requests」というレスポンスが返されます。

ステップ3:コンピュートを起動する

コンピュートは、UIまたは APIを使用して起動できます。

UIを使用してコンピュートを起動します

  1. コンピュートの作成ページでDatabricksコンテナサービスをサポートするDatabricksランタイムバージョンを指定します。

  2. [詳細設定] で、[ Docker ] タブを選択します。

  3. [ 自分のDockerコンテナを使用する ]を選択します。

  4. [ 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>

  5. 認証タイプを選択します。 シークレットを使用して、ユーザー名とパスワードの認証値を保存できます。 Dockerイメージ認証を参照してください。

APIを使用してコンピュートを起動します

  1. APIトークンを生成します

  2. Databricks CLIを使用して、カスタムDockerベースでコンピュートを起動します。

    Bash
    databricks 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>"
    }
    }'

Dockerイメージ認証

認証要件は、 Dockerイメージの種類によって異なります。 シークレットを使用して、認証のユーザー名とパスワードを保存することもできます。 「認証にシークレットを使用する」を参照してください。

  • パブリック Dockerイメージの場合、認証情報を含める必要はありません。 UI で、[ 認証 ] を [デフォルト ] に設定します。 API 呼び出しには、basic_auth フィールド を含めないでください

  • プライベート Dockerイメージの場合は、サービスプリンシパル ID とパスワード (または該当するシークレット) をユーザー名とパスワードとして使用して認証します。

  • Azure Container Registry の場合は、サービスプリンシパル ID とパスワード (または該当するシークレット) をユーザー名とパスワードとして使用して認証します。サービスプリンシパルの作成に関する情報については、Azure Container Registry サービスプリンシパル の認証 のドキュメントを参照してください。

  • Amazon ECR イメージの場合、認証情報を含めないでください。 代わりに、イメージが存在する リポジトリからイメージをプルするアクセス許可を含む インスタンスプロファイル DockerDockerを使用して コンピュートを起動します。これを行うには、 インスタンスプロファイルを使用して 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"
    ]
    }
    ]
    }

認証にシークレットを使用する

Databricks コンテナ サービス は、認証にシークレットを使用することをサポートしています。 UI でコンピュート リソースを作成する場合は、 認証 フィールドを使用して ユーザー名とパスワード を選択し、プレーン テキストのユーザー名またはパスワードを入力する代わりに、 {{secrets/<scope-name>/<dcs-secret>}} 形式でシークレットを入力します。 API を使用する場合は、 basic_auth フィールドにシークレットを入力します。

シークレットの作成に関する情報については、「 シークレットの管理」を参照してください。

initスクリプトを使用する

Databricksコンテナサービスによって、お客様が Docker コンテナにinitスクリプトを含めることができるようにします。 ほとんどの場合、initスクリプトを避け、代わりに Docker を直接(Dockerfileを使用して)カスタマイズする必要があります。 ただし、特定のタスクは、コンテナがビルドされるときではなく、コンテナの開始時に実行する必要があります。 これらのタスクにはinitスクリプトを使用します。

たとえば、カスタムコンテナー内でセキュリティデーモンを実行するとします。イメージ構築パイプラインを使用して、Dockerイメージにデーモンをインストールしてビルドします。次に、デーモンを起動するinitスクリプトを追加します。この例では、initスクリプトに「systemctl start my-daemon」のような行が含まれます。

APIでは、次のようにコンピュート仕様の一部としてinitスクリプトを指定できます。詳細については、 クラスター APIを参照してください。

Bash
"init_scripts": [
{
"file": {
"destination": "file:/my/local/file.sh"
}
}
]

Databricksコンテナサービスイメージの場合は、initスクリプトをクラウドストレージに保存することもできます。

次の手順は、 Databricksコンテナサービスを使用するコンピュートを起動するときに実行されます。

  1. VMはクラウドプロバイダーから取得されます。
  2. カスタムDockerイメージはリポジトリからダウンロードされます。
  3. Databricksは、イメージからDockerコンテナーを作成します。
  4. Databricks RuntimeコードがDockerコンテナーにコピーされます。
  5. initスクリプトが実行されます。 「initスクリプトとは」を参照してください。

DatabricksはDockerのCMDおよびENTRYPOINTプリミティブを無視します。

コンテナサービスの有効化

コンピュートでカスタムコンテナを使用するには、ワークスペース管理者が Databricksコンテナサービスを有効にする必要があります。

ワークスペース 管理者は、Databricks CLIを使用してDatabricks コンテナ サービスを有効にすることができます。JSON リクエスト本文で、次の例のように enableDcstrueに指定します。

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