

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

# 도커 이미지를 사용자 지정하는 방법
<a name="docker-custom-images-steps"></a>

다음 단계를 수행하여 Amazon EMR on EKS에 대한 Docker 이미지를 사용자 지정합니다. 이 단계에서는 기본 이미지를 가져오고, 사용자 지정 및 게시하며, 이미지를 사용하여 워크로드를 제출하는 방법을 보여줍니다.
+ [사전 조건](#docker-custom-images-prereq)
+ [1단계: Amazon Elastic Container Registry(Amazon ECR)에서 기본 이미지 검색](#docker-custom-images-retrieve)
+ [2단계: 기본 이미지 사용자 지정](#docker-custom-images-customize)
+ [3단계: (선택적 권장 사항) 사용자 이미지 검증](#docker-custom-images-validate)
+ [4단계: 사용자 지정 이미지 게시](#docker-custom-images-publish)
+ [5단계: 사용자 지정 이미지를 사용하여 Amazon EMR에서 Spark 워크로드 제출](#docker-custom-images-submit)

**참고**  
Docker 이미지를 사용자 지정할 때 고려할 몇 가지 옵션으로, 대화형 엔드포인트에 맞게 사용자 지정하는 방법(이를 통해 필요한 종속 항목을 확보함) 또는 다중 아키텍처 컨테이너 이미지를 사용하는 방법이 있습니다.  
[대화형 엔드포인트에 대한 도커 이미지 사용자 지정](docker-custom-images-managed-endpoint.md)
[다중 아키텍처 이미지 작업](docker-custom-images-multi-architecture.md)

## 사전 조건
<a name="docker-custom-images-prereq"></a>
+ Amazon EMR on EKS에 대한 [Amazon EMR on EKS 설정](setting-up.md) 단계를 수행합니다.
+ 환경에 Docker를 설치합니다. 자세한 내용은 [Get Docker](https://docs.docker.com/get-docker/)를 참조하세요.

## 1단계: Amazon Elastic Container Registry(Amazon ECR)에서 기본 이미지 검색
<a name="docker-custom-images-retrieve"></a>

기본 이미지에는 다른 AWS 서비스에 액세스하는 데 사용되는 Amazon EMR 런타임 및 커넥터가 포함되어 있습니다. Amazon EMR 6.9.0 이상에서는 Amazon ECR 퍼블릭 갤러리에서 기본 이미지를 가져올 수 있습니다. 갤러리를 탐색하여 이미지 링크를 찾은 다음, 이미지를 로컬 Workspace로 가져옵니다. 예를 들어 Amazon EMR 7.12.0 릴리스의 경우 다음 `docker pull` 명령은 가장 최근의 표준 기본 이미지를 가져옵니다. `emr-7.12.0:latest`를 `emr-7.12.0-spark-rapids:latest`로 바꾸어 Nvidia RAPIDS 액셀러레이터가 있는 이미지를 검색할 수 있습니다. `emr-7.12.0:latest`를 `emr-7.12.0-java11:latest`로 대체하여 Java 11 런타임에서 이미지를 검색할 수도 있습니다.

```
docker pull public.ecr.aws/emr-on-eks/spark/emr-7.12.0:latest
```

Amazon EMR 6.9.0 이하 릴리스의 기본 이미지를 검색하거나 각 리전의 Amazon ECR 레지스트리 계정에서 검색하려는 경우 다음 단계를 사용합니다.

1. 기본 이미지 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 선택에 관한 세부 정보](docker-custom-images-tag.md) 섹션을 참조하세요.

1. 기본 이미지가 저장된 Amazon ECR 리포지토리에 로그인합니다. *895885662937* 및 *us-west-2*를 Amazon ECR 레지스트리 계정 및 선택한 AWS 리전으로 바꿉니다.

   ```
   aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
   ```

1. 기본 이미지를 로컬 Workspace로 가져옵니다. *emr-6.6.0:latest*를 선택한 컨테이너 이미지 태그로 바꿉니다.

   ```
   docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   ```

## 2단계: 기본 이미지 사용자 지정
<a name="docker-custom-images-customize"></a>

다음 단계를 수행하여 Amazon ECR에서 가져온 기본 이미지를 사용자 지정합니다.

1. 로컬 Workspace에 새 `Dockerfile`을 생성합니다.

1. 방금 만든 `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
   ```

1. `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
   ```

1. `Dockerfile`이 생성된 동일한 디렉터리에서 다음 명령을 실행하여 도커 이미지를 빌드합니다. 도커 이미지의 이름(예: *emr6.6\$1custom*)을 입력합니다.

   ```
   docker build -t emr6.6_custom .
   ```

## 3단계: (선택적 권장 사항) 사용자 이미지 검증
<a name="docker-custom-images-validate"></a>

사용자 지정 이미지를 게시하기 전에 사용자 지정 이미지의 호환성을 테스트하는 것이 좋습니다. [Amazon EMR on EKS 사용자 지정 이미지 CLI](https://github.com/awslabs/amazon-emr-on-eks-custom-image-cli)를 사용하여 Amazon EMR on EKS에서 실행하는 데 필요한 파일 구조와 올바른 구성이 이미지에 있는지 확인할 수 있습니다.

**참고**  
Amazon EMR on EKS 사용자 지정 이미지 CLI에서는 이미지에 오류가 없는지 확인할 수 없습니다. 기본 이미지에서 종속성을 제거할 때 주의합니다.

다음 명령을 실행하여 사용자 지정 이미지를 검증합니다.

1. Amazon EMR on EKS 사용자 지정 이미지 CLI를 다운로드하고 설치합니다. 자세한 내용은 [Amazon EMR on EKS custom image CLI Installation Guide](https://github.com/awslabs/amazon-emr-on-eks-custom-image-cli/blob/main/installer/assets/INSTALLATION_GUIDE.md)를 참조하세요.

1. 다음 명령을 실행하여 설치를 테스트합니다.

   ```
   emr-on-eks-custom-image --version
   ```

   다음은 출력 예제입니다.

   ```
   Amazon EMR on EKS Custom Image CLI
   Version: x.xx
   ```

1. 다음 명령을 실행하여 사용자 지정 이미지를 검증합니다.

   ```
   emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_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단계: 사용자 지정 이미지 게시
<a name="docker-custom-images-publish"></a>

Amazon ECR 레지스트리에 새 도커 이미지를 게시합니다.

1. 다음 명령을 실행하여 도커 이미지를 저장할 Amazon ECR 리포지토리를 생성합니다. 리포지토리의 이름을 입력합니다 (예: *emr6.6\$1custom\$1repo*(. *us-west-2*를 해당 리전으로 바꿉니다.

   ```
   aws ecr create-repository \
       --repository-name emr6.6_custom_repo \
       --image-scanning-configuration scanOnPush=true \
       --region us-west-2
   ```

   자세한 내용은 *Amazon ECR 사용 설명서*에서 [리포지토리 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-create-repository)을 참조하세요.

1. 다음 명령을 실행하여 기본 레지스트리에 인증합니다.

   ```
   aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-west-2.amazonaws.com
   ```

   자세한 내용은 *Amazon ECR 사용 설명서*에서 [기본 레지스트리에 대해 인증](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry)을 참조하세요.

1. 이미지에 태그를 지정하고 생성한 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에 이미지 게시](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-push-image)를 참조하세요.

## 5단계: 사용자 지정 이미지를 사용하여 Amazon EMR에서 Spark 워크로드 제출
<a name="docker-custom-images-submit"></a>

사용자 지정 이미지를 만들고 게시한 후 사용자 지정 이미지를 사용하여 Amazon EMR on EKS 작업을 제출할 수 있습니다.

먼저, 다음 예제 JSON 파일에서 볼 수 있듯이 start-job-run-request.json 파일을 생성하고 사용자 지정 이미지를 참조할 `spark.kubernetes.container.image` 파라미터를 지정합니다.

**참고**  
아래 JSON 스니펫의 `entryPoint` 인수와 함께 표시된 것처럼 scheme을 사용하여 사용자 지정 이미지에서 사용 가능한 파일을 참하도록 `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 선택에 관한 세부 정보](docker-custom-images-tag.md) 섹션을 참조하세요.

**참고**  
`spark.kubernetes.driver.container.image` 및 `spark.kubernetes.executor.container.image`를 사용하여 드라이버 및 실행기 포드에 대해 다른 이미지를 지정할 수 있습니다.

# 대화형 엔드포인트에 대한 도커 이미지 사용자 지정
<a name="docker-custom-images-managed-endpoint"></a>

또한 대화형 엔드포인트에 맞게 도커 이미지를 사용자 지정하여 사용자 지정된 기본 커널 이미지를 실행할 수 있습니다. 이를 통해 EMR Studio에서 대화형 워크로드를 실행할 때 필요한 종속성을 보유할 수 있습니다.

1. 위에 설명된 [1\$14단계](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-retrieve)에 따라 도커 이미지를 사용자 지정합니다. Amazon EMR 6.9.0 릴리스 이상의 경우 Amazon ECR 퍼블릭 갤러리에서 기본 이미지 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 런타임 및 이와 함께 실행되는 노트북 커널이 포함되어 있습니다. 리전 및 컨테이너 이미지 태그 선택에 대한 자세한 내용은 [기본 이미지 URI 선택에 관한 세부 정보](docker-custom-images-tag.md) 섹션을 참조하세요.
**참고**  
현재는 기본 이미지의 재정의만 지원되며 기본 이미지에서 AWS 제공하는 것이 아닌 다른 유형의 완전히 새로운 커널을 도입하는 것은 지원되지 않습니다.

1. 사용자 지정 이미지와 함께 사용할 수 있는 대화형 엔드포인트를 생성합니다.

   다음 콘텐츠를 포함하여 `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
   ```

   자세한 내용은 [가상 클러스터의 대화형 엔드포인트 생성](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-create-eks-cluster.html#emr-studio-create-managed-endpoint)을 참조하세요.

1. EMR Studio를 통해 대화형 엔드포인트에 연결합니다. 자세한 내용은 [Studio에서 연결](https://emr-on-eks.workshop.aws/advanced/emr-studio/connecting-from-studio.html)을 참조하세요.

# 다중 아키텍처 이미지 작업
<a name="docker-custom-images-multi-architecture"></a>

Amazon EMR on EKS는 Amazon Elastic Container Registry(Amazon ECR)에 대한 다중 아키텍처 컨테이너 이미지를 지원합니다. 자세한 내용은 [Introducing multi-architecture container images for Amazon ECR](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr/)을 참조하세요.

Amazon EMR on EKS 사용자 지정 이미지는 AWS Graviton 기반 EC2 인스턴스와 non-Graviton-based 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"
         }
      }
   ]
}
```

다음 단계를 수행하여 다중 아키텍처 이미지를 생성합니다.

1. `arm64` 이미지를 가져올 수 있도록 다음 콘텐츠를 포함하는 `Dockerfile`을 생성합니다.

   ```
   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
   ```

1. 다중 아키텍처 이미지를 빌드하려면 [Introducing multi-architecture container images for Amazon ECR](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr/)의 지침을 따릅니다.
**참고**  
`arm64` 인스턴스에서 `arm64` 이미지를 생성해야 합니다. 마찬가지로 `amd64` 인스턴스에서 `amd64` 이미지를 빌드해야 합니다.

   또한 Docker `buildx` 명령을 사용하여 각 특정 인스턴스 유형에 빌드하지 않고도 다중 아키텍처 이미지를 빌드할 수 있습니다. 자세한 내용은 [Leverage multi-CPU architecture support](https://docs.docker.com/desktop/multi-arch/)를 참조하세요.

1. 다중 아키텍처 이미지를 빌드한 후 동일한 `spark.kubernetes.container.image` 파라미터를 사용하여 작업을 제출하고 해당 이미지를 가리킬 수 있습니다. AWS Graviton 기반 및 non-Graviton-based EC2 인스턴스가 모두 있는 이기종 클러스터에서 인스턴스는 이미지를 가져오는 인스턴스 아키텍처를 기반으로 올바른 아키텍처 이미지를 결정합니다.