翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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.1.0 リリースの場合、次のdocker pull
コマンドは最新の標準ベースイメージを取得します。emr-7.1.0:latest
を emr-7.1.0-spark-rapids:latest
に置き換えると、Nvidia RAPIDS アクセラレーターがあるイメージを取得できます。emr-7.1.0:latest
を emr-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 レジストリアカウントから取得したい場合は、次のステップを使用してください。
-
ベースイメージ 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 ジョブを送信できます。
まず、 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.image
と spark.kubernetes.executor.container.image
を使用して、ドライバーポッドとエグゼキュターポッドに別のイメージを指定できます。
インタラクティブエンドポイントの Docker イメージをカスタマイズする
カスタマイズされたベースカーネルイメージを実行できるように、インタラクティブエンドポイント用の Docker イメージをカスタマイズすることもできます。これは、EMR Studio からインタラクティブワークロードを実行するときに必要な依存関係を確実に確保するのに役立ちます。
-
上記のステップ 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 が提供するもの以外のタイプのまったく新しいカーネルの導入はサポートされていません。
-
カスタムイメージで使用できるインタラクティブエンドポイントを作成します。
まず、以下の内容で
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」を参照してください。
-
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" } } ] }
マルチアーキテクチャイメージを作成するには、次のステップに従います。
-
次の内容で
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
-
マルチアーキテクチャイメージを作成するには、Amazon ECR のマルチアーキテクチャコンテナイメージの紹介
の手順に従います。 注記
arm64
イメージはarm64
インスタンス上に作成する必要があります。同様に、amd64
インスタンス上にamd64
イメージを作成する必要があります。Docker
buildx
コマンドを使用すると、特定のインスタンスタイプごとに作成せずに、マルチアーキテクチャイメージを作成することもできます。詳細については、Leverage multi-CPU architecture supportを参照してください。 -
マルチアーキテクチャイメージを作成した後、同じ
spark.kubernetes.container.image
パラメータを使用してイメージを参照することにより、ジョブを送信できます。 AWS Graviton ベースの EC2 インスタンスと非 Graviton ベースの EC2 インスタンスの両方を持つ異種クラスターでは、インスタンスは、イメージをプルするインスタンスアーキテクチャに基づいて正しいアーキテクチャイメージを決定します。