Amazon EMR 클러스터에서 사용하도록 Docker 구성 - Amazon EMR

Amazon EMR 클러스터에서 사용하도록 Docker 구성

Amazon EMR 6.x에서는 Hadoop 3을 지원하므로 YARN NodeManager가 Amazon EMR 클러스터에서 직접 또는 Docker 컨테이너 내부에서 컨테이너를 시작할 수 있습니다. 도커 컨테이너는 애플리케이션 코드가 실행되는 사용자 지정 실행 환경을 제공합니다. 사용자 지정 실행 환경은 YARN NodeManager 및 기타 애플리케이션의 실행 환경과 분리됩니다.

도커 컨테이너에는 애플리케이션에서 사용하는 특수 라이브러리가 포함될 수 있으며 R 및 Python과 같은 기본 도구 및 라이브러리의 다양한 버전을 제공할 수 있습니다. 익숙한 도커 도구를 사용하여 애플리케이션의 라이브러리 및 런타임 종속 항목을 정의할 수 있습니다.

Amazon EMR 6.x 클러스터는 기본적으로 Spark와 같은 YARN 애플리케이션을 Docker 컨테이너를 사용하여 실행할 수 있도록 구성됩니다. 컨테이너 구성을 사용자 지정하려면 /etc/hadoop/conf 디렉터리에 있는 yarn-site.xmlcontainer-executor.cfg 파일에 정의된 도커 지원 옵션을 편집합니다. 각 구성 옵션 및 사용 방법에 대한 자세한 내용은 Launching applications using Docker containers를 참조하세요.

작업을 제출할 때 도커를 사용하도록 선택할 수 있습니다. 다음 변수를 사용하여 도커 런타임과 도커 이미지를 지정합니다.

  • YARN_CONTAINER_RUNTIME_TYPE=docker

  • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

도커 컨테이너를 사용하여 YARN 애플리케이션을 실행하면 작업을 제출할 때 지정한 도커 이미지를 YARN이 다운로드합니다. YARN이 이 도커 이미지를 확인할 수 있도록 도커 레지스트리를 사용해 구성해야 합니다. 도커 레지스트리의 구성 옵션은 클러스터를 배포할 때 퍼블릭 서브넷을 사용하는지 프라이빗 서브넷을 사용하는지에 따라 달라집니다.

도커 레지스트리

도커 레지스트리는 도커 이미지의 저장 및 배포 시스템입니다. Amazon EMR에서는 완전관리형 Docker 컨테이너 레지스트리인 Amazon ECR을 사용하는 것이 좋습니다. 그러면 사용자 지정 이미지를 만들어 가용성과 확장성이 뛰어난 아키텍처에서 호스팅할 수 있습니다.

배포 고려 사항

도커 레지스트리를 사용하려면 클러스터의 각 호스트에서 네트워크에 액세스할 수 있어야 합니다. 이는 YARN 애플리케이션이 클러스터에서 실행될 때 각 호스트가 도커 레지스트리에서 이미지를 다운로드하기 때문입니다. 이러한 네트워크 연결 요구 사항은 Amazon EMR 클러스터를 퍼블릭 서브넷에 배포하는지 프라이빗 서브넷에 배포하는지에 따라 Docker 레지스트리 선택을 제한할 수 있습니다.

[Public subnet]

EMR 클러스터가 퍼블릭 서브넷에 배포되면 YARN NodeManager를 실행하는 노드가 인터넷을 통해 사용 가능한 모든 레지스트리에 직접 액세스할 수 있습니다.

Private subnet

EMR 클러스터가 프라이빗 서브넷에 배포되면 YARN NodeManager를 실행하는 노드가 인터넷에 직접 액세스할 수 없습니다. 도커 이미지는 Amazon ECR에서 호스팅되고 AWS PrivateLink를 통해 액세스할 수 있습니다.

프라이빗 서브넷 시나리오에서 AWS PrivateLink를 사용하여 Amazon ECR에 액세스하는 방법에 대한 자세한 내용은 Setting up AWS PrivateLink for Amazon ECS, and Amazon ECR을 참조하세요.

도커 레지스트리 구성

Amazon EMR과 함께 Docker 레지스트리를 사용하려면 도커 이미지를 확인하는 데 사용할 특정 레지스트리를 신뢰하도록 도커를 구성해야 합니다. 기본 신뢰 레지스트리는 local(프라이빗) 및 centos입니다. 다른 퍼블릭 리포지토리 또는 Amazon ECR을 사용하려면 EMR 분류 API를 container-executor 분류 키와 함께 사용하여 /etc/hadoop/conf/container-executor.cfg에서 docker.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를 사용하여 생성한 보안 인증에 대한 참조를 전달합니다.

코어 노드 중 하나에서 다음 명령을 실행하여 ECR 계정의 로그인 줄을 가져옵니다.

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

get-login 명령은 자격 증명을 만드는 올바른 도커 CLI 명령을 생성합니다. get-login에서 출력을 복사하여 실행합니다.

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

이 명령은 /root/.docker 폴더에 config.json 파일을 생성합니다. 클러스터에 제출된 작업에서 Amazon ECR에 인증하는 데 사용할 수 있도록 이 파일을 HDFS에 복사합니다.

아래 명령을 실행하여 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은 ECR을 도커 이미지 레지스트리로 액세스하고 작업 실행 중에 컨테이너를 가져올 수 있습니다.

도커 레지스트리와 YARN을 구성한 후 도커 컨테이너를 사용하여 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을 사용하여 설정을 참조하세요.

자동 인증을 활성화하는 방법

도커 레지스트리 구성 을 통해 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의 값을 확인합니다.