

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

# 도커 이미지를 사용자 지정하는 방법
<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.13.0 릴리스의 경우 다음 `docker pull` 명령은 가장 최근의 표준 기본 이미지를 가져옵니다. `emr-7.13.0:latest`를 `emr-7.13.0-spark-rapids:latest`로 바꾸어 Nvidia RAPIDS 액셀러레이터가 있는 이미지를 검색할 수 있습니다. `emr-7.13.0:latest`를 `emr-7.13.0-java11:latest`로 대체하여 Java 11 런타임에서 이미지를 검색할 수도 있습니다.

```
docker pull public.ecr.aws/emr-on-eks/spark/{{emr-7.13.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\_custom}})을 입력합니다.

   ```
   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\_custom\_repo}}(. {{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`를 사용하여 드라이버 및 실행기 포드에 대해 다른 이미지를 지정할 수 있습니다.