Docker イメージをカスタマイズする方法
Amazon EMR on EKS の Docker イメージをカスタマイズするには、次の手順を行います。この手順では、ベースイメージを取得して、カスタマイズして公開し、イメージを使用することによってワークロードを送信する方法を示します。
注記
Docker イメージのカスタマイズ時に考慮することが必要な場合があるその他のオプションは、インタラクティブエンドポイント用にカスタマイズすることです。これは、必要な依存関係を確保する、またはマルチアーキテクチャコンテナイメージを使用するために行います。
前提条件
-
Amazon EMR on EKS で Amazon EMR on EKS のセットアップ ステップを実行します。
-
ご自分の環境に Docker をインストールします。詳細については、Get 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:latest
を emr-7.3.0-spark-rapids:latest
に置き換えると、Nvidia RAPIDS アクセラレーターがあるイメージを取得できます。emr-7.3.0:latest
を emr-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 レジストリアカウントから取得したい場合は、次のステップを使用してください。
-
ベースイメージ 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 の選択の詳細 を参照してください。
-
ベースイメージが保存されている Amazon ECR リポジトリにログインします。
895885662937
とus-west-2
を、Amazon ECR レジストリアカウントと選択した AWS リージョンに置き換えます。aws ecr get-login-password --region
us-west-2
| docker login --username AWS --password-stdin895885662937
.dkr.ecr.us-west-2
.amazonaws.com -
ベースイメージをローカルワークスペースにプルします。
emr-6.6.0:latest
を、選択したコンテナイメージタグに置き換えます。docker pull
895885662937
.dkr.ecr.us-west-2
.amazonaws.com/spark/emr-6.6.0:latest
ステップ 2: ベースイメージをカスタマイズする
Amazon ECR からプルしたベースイメージをカスタマイズするには、次の手順を行います。
-
ローカルワークスペースで新しい
Dockerfile
を作成します。 -
前の手順で作成した
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
-
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
-
Dockerfile
が作成されたディレクトリと同じディレクトリから、次のコマンドを実行して Docker イメージを作成します。Docker イメージの名前を指定します (例えば、emr6.6_custom
など)。docker build -t
emr6.6_custom
.
ステップ 3: (オプション、ただし推奨) カスタムイメージを検証する
公開する前に、カスタムイメージの互換性をテストすることをお勧めします。Amazon EMR on EKS カスタムイメージ CLI
注記
Amazon EMR on EKS カスタムイメージ CLI では、イメージにエラーがないことを確認できません。ベースイメージから依存関係を削除する際は、注意してください。
カスタムイメージを検証するには、次のステップに従います。
-
Amazon EMR on EKS カスタムイメージ CLI をダウンロードしてインストールします。詳細については、Amazon EMR on EKS カスタムイメージ CLI インストールガイド
を参照してください。 -
以下のコマンドを実行して、インストールをテストします。
emr-on-eks-custom-image --version
出力の例を以下に示します。
Amazon EMR on EKS Custom Image CLI Version: x.xx
-
以下のコマンドを実行して、カスタムイメージを検証します。
emr-on-eks-custom-image validate-image -i
image_name
-rrelease_version
[-timage_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 レジストリに公開します。
-
次のコマンドを実行して、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 \ --regionus-west-2
詳細については、Amazon ECR ユーザーガイドのリポジトリの作成を参照してください。
-
次のコマンドを実行して、デフォルトレジストリに対して認証します。
aws ecr get-login-password --region
us-west-2
| docker login --username AWS --password-stdinaws_account_id
.dkr.ecr.us-west-2
.amazonaws.com詳細については、Amazon ECR ユーザーガイドのデフォルトレジストリに対して認証するを参照してください。
-
イメージにタグを付けて、作成した 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.image
と spark.kubernetes.executor.container.image
を使用して、ドライバーポッドとエグゼキュターポッドに別のイメージを指定できます。