Docker イメージをカスタマイズする方法 - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Docker イメージをカスタマイズする方法

Amazon EMR on EKS の Docker イメージをカスタマイズするには、次のステップに従います。

Docker イメージをカスタマイズする際に考慮すべきその他のオプションは、次のとおりです。

前提条件

ステップ 1: Amazon Elastic Container Registry (Amazon ECR) からベースイメージを取得する

ベースイメージには、Amazon EMR ランタイムと、他の AWS サービスへのアクセスに使用されるコネクタが含まれています。Amazon EMR 6.9.0 以降の場合は、Amazon ECR Public Gallery からベースイメージを取得できます。ギャラリーを参照してイメージリンクを見つけ、そのイメージをローカルワークスペースに取り込みます。例えば、Amazon EMR 7.1.0 リリースの場合、次のdocker pullコマンドは最新の標準ベースイメージを取得します。emr-7.1.0:latestemr-7.1.0-spark-rapids:latest に置き換えると、Nvidia RAPIDS アクセラレーターがあるイメージを取得できます。emr-7.1.0:latestemr-7.1.0-java11:latest に置き換えて Java 11 ランタイムでイメージを取得することもできます。

docker pull public.ecr.aws/emr-on-eks/spark/emr-7.1.0:latest

Amazon EMR 6.9.0 以前のリリースのベースイメージを取得したい場合、または各リージョンの Amazon ECR レジストリアカウントから取得したい場合は、次のステップを使用してください。

  1. ベースイメージ URI を選択します。次の例で示されるように、イメージ URI は ECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag の形式に従います。

    895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest

    ご利用のリージョンのベースイメージを選択するには、ベースイメージ URI を選択する方法 を参照してください。

  2. ベースイメージが保存されている Amazon ECR リポジトリにログインします。895885662937us-west-2 を Amazon ECR レジストリアカウントと選択した AWS リージョンに置き換えます。

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
  3. ベースイメージをローカルワークスペースにプルします。emr-6.6.0:latest を、選択したコンテナイメージタグに置き換えます。

    docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest

ステップ 2: ベースイメージをカスタマイズする

Amazon ECR からプルしたベースイメージをカスタマイズするには、次のステップに従います。

  1. ローカルワークスペースで新しい Dockerfile を作成します。

  2. 前の手順で作成した Dockerfile を編集し、以下のコンテンツを追加します。この Dockerfile は、895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest からプルしたコンテナイメージを使用します。

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root ### Add customization commands here #### USER hadoop:hadoop
  3. Dockerfile にコマンドを追加して、ベースイメージをカスタマイズします。たとえば、次の Dockerfile で示すように、Python ライブラリをインストールするコマンドを追加します。

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root RUN pip3 install --upgrade boto3 pandas numpy // For python 3 USER hadoop:hadoop
  4. Dockerfile が作成されたディレクトリと同じディレクトリから、次のコマンドを実行して Docker イメージを作成します。Docker イメージの名前を指定します (例えば、emr6.6_custom など)。

    docker build -t emr6.6_custom .

ステップ 3: (オプション、ただし推奨) カスタムイメージを検証する

公開する前に、カスタムイメージの互換性をテストすることをお勧めします。Amazon EMR on EKS カスタムイメージ CLI を使用して、イメージに Amazon EMR on EKS で実行するために必要なファイル構造と正しい構成があるかどうかを確認できます。

注記

Amazon EMR on EKS カスタムイメージ CLI では、イメージにエラーがないことを確認できません。ベースイメージから依存関係を削除する際は、注意してください。

カスタムイメージを検証するには、次のステップに従います。

  1. Amazon EMR on EKS カスタムイメージ CLI をダウンロードしてインストールします。詳細については、Amazon EMR on EKS カスタムイメージ CLI インストールガイドを参照してください。

  2. 以下のコマンドを実行して、インストールをテストします。

    emr-on-eks-custom-image --version

    出力の例を以下に示します。

    Amazon EMR on EKS Custom Image CLI Version: x.xx
  3. 以下のコマンドを実行して、カスタムイメージを検証します。

    emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_type]
    • -i には、検証する必要のあるローカルイメージ URI を指定します。これには、イメージ URI や、イメージについて定義した任意の名前またはタグを指定できます。

    • -r には、ベースイメージの正確なリリースバージョンを指定します (たとえば、emr-6.6.0-latest など)。

    • -t には、イメージタイプを指定します。これが Spark イメージの場合は、spark を入力します。デフォルト値は、sparkです。現在の Amazon EMR on EKS カスタムイメージ CLI バージョンでは、Spark ランタイムイメージのみがサポートされています。

    コマンドが正常に実行され、カスタムイメージが必須のすべての設定とファイル構造を満たしている場合、以下の例で示すように、返される出力にはすべてのテストの結果が表示されます。

    Amazon EMR on EKS Custom Image Test Version: x.xx ... Checking if docker cli is installed ... Checking Image Manifest [INFO] Image ID: xxx [INFO] Created On: 2021-05-17T20:50:07.986662904Z [INFO] Default User Set to hadoop:hadoop : PASS [INFO] Working Directory Set to /home/hadoop : PASS [INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS [INFO] SPARK_HOME is set with value: /usr/lib/spark : PASS [INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS [INFO] File Structure Test for spark-jars in /usr/lib/spark/jars: PASS [INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS [INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS [INFO] File Structure Test for bin-files in /usr/bin: PASS ... Start Running Sample Spark Job [INFO] Sample Spark Job Test with local:///usr/lib/spark/examples/jars/spark-examples.jar : PASS ----------------------------------------------------------------- Overall Custom Image Validation Succeeded. -----------------------------------------------------------------

    カスタムイメージが必須の設定またはファイル構造を満たしていない場合、エラーメッセージが表示されます。返される出力では、誤った設定またはファイル構造に関する情報が提供されます。

ステップ 4: カスタムイメージを公開する

新しい Docker イメージを Amazon ECR レジストリに公開します。

  1. 次のコマンドを実行して、Docker イメージを保存するための Amazon ECR リポジトリを作成します。リポジトリの名前を入力します (例えば、emr6.6_custom_repo など)。us-west-2 を、ご利用のリージョンに置き換えます。

    aws ecr create-repository \ --repository-name emr6.6_custom_repo \ --image-scanning-configuration scanOnPush=true \ --region us-west-2

    詳細については、Amazon ECR ユーザーガイドリポジトリの作成を参照してください。

  2. 次のコマンドを実行して、デフォルトレジストリに対して認証します。

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-west-2.amazonaws.com

    詳細については、Amazon ECR ユーザーガイドデフォルトレジストリに対して認証するを参照してください。

  3. イメージにタグを付けて、作成した Amazon ECR リポジトリに公開します。

    イメージにタグを付けます。

    docker tag emr6.6_custom aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo

    イメージをプッシュします。

    docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo

    詳細については、Amazon ECR ユーザーガイドイメージを Amazon ECR にプッシュするを参照してください。

ステップ 5: カスタムイメージを使用して Amazon EMR で Spark ワークロードを送信する

カスタムイメージを作成して公開したら、カスタムイメージを使用して Amazon EMR on EKS ジョブを送信できます。

まず、 start-job-run-request.json ファイルを作成し、次の JSON ファイルの例に示すように、カスタムイメージを参照する spark.kubernetes.container.imageパラメータを指定します。

注記

以下の JSON スニペットの entryPoint 引数で示すように、local:// スキームを使用してカスタムイメージで利用可能なファイルを参照できます。local:// スキームを使用して、アプリケーションの依存関係を参照することもできます。local:// スキームを使用して参照されるすべてのファイルと依存関係は、カスタムイメージの指定されたパスにすでに存在している必要があります。

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.6.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.kubernetes.container.image=123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo" } } }

次の例で示すように、applicationConfiguration プロパティを使用してカスタムイメージを参照することもできます。

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.6.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi" } }, "configurationOverrides": { "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.kubernetes.container.image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo" } } ] } }

次に、start-job-run コマンドを実行してジョブを送信します。

aws emr-containers start-job-run --cli-input-json file://./start-job-run-request.json

上記の JSON の例では、emr-6.6.0-latest を Amazon EMR リリースバージョンに置き換えます。-latest リリースバージョンを使用して、選択したバージョンに最新のセキュリティ更新プログラムが含まれていることを確認することを強くお勧めします。Amazon EMR リリースバージョンおよびそれらのイメージタグの詳細については、「ベースイメージ URI を選択する方法」を参照してください。

注記

spark.kubernetes.driver.container.imagespark.kubernetes.executor.container.image を使用して、ドライバーポッドとエグゼキュターポッドに別のイメージを指定できます。

インタラクティブエンドポイントの Docker イメージをカスタマイズする

カスタマイズされたベースカーネルイメージを実行できるように、インタラクティブエンドポイント用の Docker イメージをカスタマイズすることもできます。これは、EMR Studio からインタラクティブワークロードを実行するときに必要な依存関係を確実に確保するのに役立ちます。

  1. 上記のステップ 1〜4 に従って、Docker イメージをカスタマイズします。Amazon EMR 6.9.0 リリース以降では、Amazon ECR Public Gallery からベースイメージ URI を取得できます。Amazon EMR 6.9.0 より前のリリースでは、それぞれの AWS リージョンの Amazon ECR レジストリアカウントでイメージを取得できますが、唯一の違いは Dockerfile 内のベースイメージ URI です。ベースイメージ URI は次の形式に従います。

    ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag

    spark の代わりに、ベースイメージ URI で notebook-spark を使用する必要があります。ベースイメージには、Spark ランタイムと、Spark ランタイムで実行されるノートブックのカーネルが含まれています。リージョンとコンテナイメージタグの選択について詳しくは、ベースイメージ URI を選択する方法 を参照してください。

    注記

    現在、ベースイメージのオーバーライドのみがサポートされており、ベースイメージ AWS が提供するもの以外のタイプのまったく新しいカーネルの導入はサポートされていません。

  2. カスタムイメージで使用できるインタラクティブエンドポイントを作成します。

    まず、以下の内容で custom-image-managed-endpoint.json という JSON ファイルを作成します。

    { "name": "endpoint-name", "virtualClusterId": "virtual-cluster-id", "type": "JUPYTER_ENTERPRISE_GATEWAY", "releaseLabel": "emr-6.6.0-latest", "executionRoleArn": "execution-role-arn", "certificateArn": "certificate-arn", "configurationOverrides": { "applicationConfiguration": [ { "classification": "jupyter-kernel-overrides", "configurations": [ { "classification": "python3", "properties": { "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-python:latest" } }, { "classification": "spark-python-kubernetes", "properties": { "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-spark:latest" } } ] } ] } }

    次に、次の例で示すように、JSON ファイルで指定された設定を使用してインタラクティブエンドポイントを作成します。

    aws emr-containers create-managed-endpoint --cli-input-json custom-image-managed-endpoint.json

    詳細については、「Create an interactive endpoint for your virtual cluster」を参照してください。

  3. EMR Studio 経由でインタラクティブエンドポイントに接続します。詳細については、Connecting from Studio を参照してください。

マルチアーキテクチャイメージを使用する

Amazon EMR on EKS は、Amazon Elastic Container Registry (Amazon ECR) のマルチアーキテクチャコンテナイメージをサポートしています。詳細については、Amazon ECR のマルチアーキテクチャコンテナイメージの紹介を参照してください。

Amazon EMR on EKS カスタムイメージは、 AWS Graviton ベースの EC2 インスタンスと非 Graviton ベースの EC2 インスタンスの両方をサポートします。Graviton ベースのイメージは、非 Graviton ベースのイメージと同じ Amazon ECR のイメージリポジトリに格納されています。

例えば、Docker マニフェストリストに 6.6.0 イメージがあるかどうかを確認するには、次のコマンドを実行します。

docker manifest inspect 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest

出力は次のとおりです。arm64 アーキテクチャは Graviton インスタンス用です。amd64 は 非 Graviton インスタンス用です。

{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1805, "digest": "xxx123:6b971cb47d11011ab3d45fff925e9442914b4977ae0f9fbcdcf5cfa99a7593f0", "platform": { "architecture": "arm64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1805, "digest": "xxx123:6f2375582c9c57fa9838c1d3a626f1b4fc281e287d2963a72dfe0bd81117e52f", "platform": { "architecture": "amd64", "os": "linux" } } ] }

マルチアーキテクチャイメージを作成するには、次のステップに従います。

  1. 次の内容で Dockerfile を作成して、arm64 イメージをプルできるようにします。

    FROM --platform=arm64 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest USER root RUN pip3 install boto3 // install customizations here USER hadoop:hadoop
  2. マルチアーキテクチャイメージを作成するには、Amazon ECR のマルチアーキテクチャコンテナイメージの紹介の手順に従います。

    注記

    arm64 イメージは arm64 インスタンス上に作成する必要があります。同様に、amd64 インスタンス上に amd64 イメージを作成する必要があります。

    Docker buildx コマンドを使用すると、特定のインスタンスタイプごとに作成せずに、マルチアーキテクチャイメージを作成することもできます。詳細については、Leverage multi-CPU architecture support を参照してください。

  3. マルチアーキテクチャイメージを作成した後、同じ spark.kubernetes.container.image パラメータを使用してイメージを参照することにより、ジョブを送信できます。 AWS Graviton ベースの EC2 インスタンスと非 Graviton ベースの EC2 インスタンスの両方を持つ異種クラスターでは、インスタンスは、イメージをプルするインスタンスアーキテクチャに基づいて正しいアーキテクチャイメージを決定します。