도커 이미지를 사용자 지정하는 방법 - Amazon EMR

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

도커 이미지를 사용자 지정하는 방법

다음 단계를 수행하여 Amazon EMR on EKS에 대한 Docker 이미지를 사용자 지정합니다. 이 단계에서는 기본 이미지를 가져오고, 사용자 지정 및 게시하며, 이미지를 사용하여 워크로드를 제출하는 방법을 보여줍니다.

참고

Docker 이미지를 사용자 지정할 때 고려할 몇 가지 옵션으로, 대화형 엔드포인트에 맞게 사용자 지정하는 방법(이를 통해 필요한 종속 항목을 확보함) 또는 다중 아키텍처 컨테이너 이미지를 사용하는 방법이 있습니다.

사전 조건

1단계: Amazon Elastic Container Registry(Amazon ECR)에서 기본 이미지 검색

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

docker pull public.ecr.aws/emr-on-eks/spark/emr-7.6.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 선택에 관한 세부 정보 섹션을 참조하세요.

  2. 기본 이미지가 저장된 Amazon ECR 리포지토리에 로그인합니다. 895885662937us-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
  3. 기본 이미지를 로컬 Workspace로 가져옵니다. emr-6.6.0:latest를 선택한 컨테이너 이미지 태그로 바꿉니다.

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

2단계: 기본 이미지 사용자 지정

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

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

  2. 방금 만든 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
  3. 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
  4. Dockerfile이 생성된 동일한 디렉터리에서 다음 명령을 실행하여 도커 이미지를 빌드합니다. 도커 이미지의 이름(예: emr6.6_custom)을 입력합니다.

    docker build -t emr6.6_custom .

3단계: (선택적 권장 사항) 사용자 이미지 검증

사용자 지정 이미지를 게시하기 전에 사용자 지정 이미지의 호환성을 테스트하는 것이 좋습니다. Amazon EMR on EKS 사용자 지정 이미지 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를 참조하세요.

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

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

    다음은 출력 예제입니다.

    Amazon EMR on EKS Custom Image CLI Version: x.xx
  3. 다음 명령을 실행하여 사용자 지정 이미지를 검증합니다.

    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단계: 사용자 지정 이미지 게시

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 사용 설명서에서 리포지토리 생성을 참조하세요.

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

    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 사용 설명서에서 기본 레지스트리에 대해 인증을 참조하세요.

  3. 이미지에 태그를 지정하고 생성한 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에 이미지 게시를 참조하세요.

5단계: 사용자 지정 이미지를 사용하여 Amazon EMR에서 Spark 워크로드 제출

사용자 지정 이미지를 만들고 게시한 후 사용자 지정 이미지를 사용하여 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 선택에 관한 세부 정보 섹션을 참조하세요.

참고

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