Docker の設定 - Amazon EMR

Docker の設定

Amazon EMR 6.x は Hadoop 3 をサポートしているため、YARN NodeManager によって Amazon EMR クラスターで直接コンテナを起動したり、Docker コンテナ内でコンテナを起動したりできます。Docker コンテナは、アプリケーションコードを実行するカスタム実行環境を提供します。カスタム実行環境は、YARN NodeManager やその他のアプリケーションの実行環境から分離されます。

Docker コンテナには、アプリケーションで使用する特別なライブラリを含めることができます。また、Docker コンテナは、R や Python など、ネイティブツールやライブラリの異なるバージョンを提供できます。使い慣れた Docker ツールを使用して、アプリケーションのライブラリとランタイム依存関係を定義できます。

Amazon EMR 6.x クラスターは、デフォルトの設定では、Docker コンテナを使用して YARN アプリケーション (Spark など) を実行できます。コンテナ設定をカスタマイズするには、/etc/hadoop/conf ディレクトリの yarn-site.xml ファイルと container-executor.cfg ファイルに定義されている Docker サポートオプションを編集します。各設定オプションとその使用方法の詳細については、「Launching Applications Using Docker Containers」を参照してください。

ジョブを送信するときに Docker を使用することを選択できます。Docker ランタイムと Docker イメージを指定するには、次の変数を使用します。

  • YARN_CONTAINER_RUNTIME_TYPE=docker

  • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

Docker コンテナを使用して YARN アプリケーションを実行すると、YARN はジョブの送信時に指定した Docker イメージをダウンロードします。この Docker イメージを YARN で解決するには、Dockerレジストリを設定する必要があります。Docker レジストリの設定オプションは、クラスターのデプロイにパブリックサブネットとプライベートサブネットのどちらを使用するかによって異なります。

Docker レジストリ

Docker レジストリは、Docker イメージのストレージおよびディストリビューションシステムです。Amazon EMR の場合、フルマネージド型の Docker コンテナレジストリである Amazon ECR を使用することをお勧めします。これにより、独自のカスタムイメージを作成し、これらのイメージを可用性とスケーラビリティに優れたアーキテクチャでホストできます。

デプロイに関する考慮事項

Docker レジストリは、クラスター内の各ホストからのネットワークアクセスを必要とします。これは、YARN アプリケーションがクラスターで実行されているときに、各ホストが Docker レジストリからイメージをダウンロードするためです。これらのネットワーク接続要件により、Amazon EMR クラスターのデプロイ先をパブリックサブネットとプライベートサブネットのどちらにするかで、Docker レジストリの選択が制限される場合があります。

パブリックサブネット

EMR クラスターをパブリックサブネットにデプロイすると、YARN NodeManager を実行しているノードは、インターネット経由で利用可能なすべてのレジストリに直接アクセスできます。

プライベートサブネット

EMR クラスターをプライベートサブネットにデプロイすると、YARN NodeManager を実行しているノードはインターネットに直接アクセスできません。Docker イメージは、 Amazon ECR でホストし、AWS PrivateLink を介してアクセスできます。

プライベートサブネットのシナリオで AWS PrivateLink を使用して Amazon ECR へのアクセスを許可する方法の詳細については、「Amazon ECS および Amazon ECR 用に AWS PrivateLink をセットアップする」を参照してください。

Docker レジストリの設定

Amazon EMR で Docker レジストリを使用するには、Docker イメージの解決に使用する特定のレジストリを信頼するように Docker を設定する必要があります。デフォルトの信頼レジストリは、ローカル (プライベート) と centos です。他のパブリックリポジトリや Amazon ECR を使用する場合は、EMR 分類 API を container-executor 分類キーで使用して、/etc/hadoop/conf/container-executor.cfgdocker.trusted.registries 設定をオーバーライドできます。

次の例は、your-public-repo という名前のパブリックリポジトリと、ECR レジストリエンドポイント 123456789123.dkr.ecr.us-east-1.amazonaws.com の両方を信頼するようにクラスターを設定する方法を示しています。ECR を使用する場合は、このエンドポイントを特定の ECR エンドポイントに置き換えます。

[ { "Classification": "container-executor", "Configurations": [ { "Classification": "docker", "Properties": { "docker.trusted.registries": "local,centos,your-public-repo,123456789123.dkr.ecr.us-east-1.amazonaws.com", "docker.privileged-containers.registries": "local,centos,your-public-repo,123456789123.dkr.ecr.us-east-1.amazonaws.com" } } ] } ]

AWS Command Line Interface (AWS CLI) を使用して、この設定で Amazon EMR 6.0.0 クラスターを起動するには、container-executor.json という名前のファイルを作成して上の container-executor JSON 設定の内容を含めます。次に、次のコマンドを使用してクラスターを起動します。

export KEYPAIR=<Name of your Amazon EC2 key-pair> export SUBNET_ID=<ID of the subnet to which to deploy the cluster> export INSTANCE_TYPE=<Name of the instance type to use> export REGION=<Region to which to deploy the cluster> aws emr create-cluster \ --name "EMR-6.0.0" \ --region $REGION \ --release-label emr-6.0.0 \ --applications Name=Hadoop Name=Spark \ --service-role EMR_DefaultRole \ --ec2-attributes KeyName=$KEYPAIR,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=$SUBNET_ID \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=$INSTANCE_TYPE InstanceGroupType=CORE,InstanceCount=2,InstanceType=$INSTANCE_TYPE \ --configuration file://container-executor.json

EMR 6.0.0 以前で Amazon ECR にアクセスするための YARN の設定

Amazon ECR を初めて使用する場合は、「Amazon ECR の開始方法」の手順に従い、Amazon EMR クラスター内の各インスタンスから Amazon ECR にアクセスできることを確認します。

EMR 6.0.0 以前では、Docker コマンドを使用して Amazon ECR にアクセスするには、まず認証情報を生成する必要があります。YARN が Amazon ECR からイメージにアクセスできることを確認するには、コンテナ環境変数 YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG を使用して、生成した認証情報への参照を渡します。

コアノードの 1 つで次のコマンドを実行して、ECR アカウントのログイン行を取得します。

aws ecr get-login --region us-east-1 --no-include-email

get-login コマンドは、認証情報を作成するために実行する必要がある正しい Docker CLI コマンドを生成します。get-login から出力をコピーして実行します。

sudo docker login -u AWS -p <password> https://<account-id>.dkr.ecr.us-east-1.amazonaws.com

このコマンドは、/root/.docker フォルダ内に config.json ファイルを生成します。このファイルを HDFS にコピーします。クラスターに送信されたジョブは、このファイルを使用して Amazon ECR に対して認証することができます。

次のコマンドを実行して、config.json ファイルをホームディレクトリにコピーします。

mkdir -p ~/.docker sudo cp /root/.docker/config.json ~/.docker/config.json sudo chmod 644 ~/.docker/config.json

次のコマンドを実行して、config.json を HDFS に配置し、クラスターで実行されるジョブで使用できるようにします。

hadoop fs -put ~/.docker/config.json /user/hadoop/

YARNは、Docker イメージレジストリとしての ECR にアクセスし、ジョブ実行中にコンテナをプルできます。

Docker レジストリと YARN を設定したら、Docker コンテナを使用して YARN アプリケーションを実行できます。詳細については、「Amazon EMR 6.0.0 を使用して Docker で Spark アプリケーションを実行する」を参照してください。

EMR 6.1.0 以降では、Amazon ECR への認証を手動でセットアップする必要はありません。container-executor 分類キーで Amazon ECR レジストリが検出された場合、Amazon ECR 自動認証機能がアクティブになり、ECR イメージで Spark ジョブを送信する際に YARN が認証プロセスを処理します。yarn-site で yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled を調べると、自動認証が有効になっているかどうかを確認することができます。docker.trusted.registries に ECR レジストリ URL が含まれている場合、自動認証が有効であり、YARN 認証設定が true に設定されています。

Amazon ECR への自動認証を使用するための前提条件

  • EMR バージョン 6.1.0 以降

  • 設定に含まれる ECR レジストリは、クラスターと同じリージョンにあります

  • 認証トークンを取得し、任意のイメージをプルする許可を持つ IAM ロール

詳細については、「Amazon ECR を使用してセットアップする」を参照してください。

自動認証を有効にする方法

Docker レジストリの設定 」に従って Amazon ECR レジストリを信頼できるレジストリとして設定し、Amazon ECR リポジトリとクラスターが同じリージョンにあることを確認します。

信頼できるレジストリに ECR レジストリが設定されていない場合でもこの機能を有効にするには、設定分類を使用して yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabledtrue に設定します。

自動認証を無効にする方法

デフォルトでは、信頼できるレジストリで Amazon ECR レジストリが検出されない場合、自動認証は無効になります。

信頼できるレジストリに Amazon ECR レジストリが設定されている場合でも自動認証を無効にするには、設定分類を使用して yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabledfalse に設定します。

クラスターで自動認証が有効になっているかどうかを確認する方法

マスターノードで、vi などのテキストエディタを使用して、ファイル vi /etc/hadoop/conf.empty/yarn-site.xml のコンテンツを表示します。yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled の値を確認します。