

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon EMR 클러스터에서 사용하도록 Docker 구성
<a name="emr-plan-docker"></a>

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.xml` 및 `container-executor.cfg` 파일에 정의된 도커 지원 옵션을 편집합니다. 각 구성 옵션 및 사용 방법에 대한 자세한 내용은 [Launching applications using Docker containers](https://hadoop.apache.org/docs/r3.1.0/hadoop-yarn/hadoop-yarn-site/DockerContainers.html)를 참조하세요.

작업을 제출할 때 도커를 사용하도록 선택할 수 있습니다. 다음 변수를 사용하여 도커 런타임과 도커 이미지를 지정합니다.
+ `YARN_CONTAINER_RUNTIME_TYPE=docker`
+ `YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={{{DOCKER_IMAGE_NAME}}}`

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

## 도커 레지스트리
<a name="emr-docker-registries"></a>

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

**배포 고려 사항**

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

**Public subnet**

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

**Private subnet**

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

를 사용하여 프라이빗 서브넷 시나리오에서 Amazon ECR에 대한 액세스를 AWS PrivateLink 허용하는 방법에 [AWS PrivateLink 대한 자세한 내용은 Amazon ECS 및 Amazon ECR 설정을](https://aws.amazon.com/blogs/compute/setting-up-aws-privatelink-for-amazon-ecs-and-amazon-ecr/) 참조하세요.

## 도커 레지스트리 구성
<a name="emr-docker-hub"></a>

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 클러스터를 시작하려면 이전 ontainer-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 구성
<a name="emr-docker-ECR"></a>

Amazon ECR을 처음 사용하는 경우 [Amazon ECR 시작하기](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_GetStarted.html)의 지침에 따라 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 애플리케이션 실행](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-docker.html)을 참조하세요.

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을 사용하여 설정](https://docs.aws.amazon.com/AmazonECR/latest/userguide/get-set-up-for-amazon-ecr.html)을 참조하세요.

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

[도커 레지스트리 구성](#emr-docker-hub)을 통해 Amazon ECR 레지스트리를 신뢰할 수 있는 레지스트리로 설정하고 Amazon ECR 리포지토리와 클러스터가 동일한 리전에 있는지 확인합니다.

ECR 레지스트리가 신뢰할 수 있는 레지스트리에 설정되어 있지 않은 경우에도 이 기능을 활성화하려면 구성 분류를 사용하여 `yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled`를 `true`로 설정합니다.

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

기본적으로 신뢰할 수 있는 레지스트리에서 Amazon ECR 레지스트리가 감지되지 않으면 자동 인증이 비활성화됩니다.

Amazon ECR 레지스트리가 신뢰할 수 있는 레지스트리에 설정된 경우에도 자동 인증을 비활성화하려면 구성 분류를 사용하여 `yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled`를 `false`로 설정합니다.

**클러스터에서 자동 인증이 활성화되었는지 확인하는 방법**

프라이머리 노드에서 텍스트 편집기(예: `vi`)를 사용하여 `vi /etc/hadoop/conf.empty/yarn-site.xml` 파일의 콘텐츠를 확인합니다. `yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled`의 값을 확인합니다.