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.3.0 リリースの場合、次の docker pull コマンドは最新の標準ベースイメージを取得します。emr-7.3.0:latestemr-7.3.0-spark-rapids:latest に置き換えると、Nvidia RAPIDS アクセラレーターがあるイメージを取得できます。emr-7.3.0:latestemr-7.3.0-java11:latest に置き換えて Java 11 ランタイムでイメージを取得することもできます。

docker pull public.ecr.aws/emr-on-eks/spark/emr-7.3.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 ジョブを送信できます。

まず、次の JSON ファイルの例で示すように、start-job-run-request.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 を使用して、ドライバーポッドとエグゼキュターポッドに別のイメージを指定できます。