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

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

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

다음 단계에 따라 Amazon EMR on EKS용 도커 이미지를 사용자 지정합니다.

도커 이미지를 사용자 지정할 때 고려할 수 있는 다른 옵션은 다음과 같습니다.

필수 조건

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

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

docker pull public.ecr.aws/emr-on-eks/spark/emr-7.1.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 리포지토리에 로그인합니다. 895885662937 및 us-west-2를 아마존 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를 사용하여 드라이버 및 실행기 포드에 대해 다른 이미지를 지정할 수 있습니다.

대화형 엔드포인트에 대한 도커 이미지 사용자 지정

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

  1. 위에 설명된 1~4단계에 따라 도커 이미지를 사용자 지정합니다. 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를 선택하는 방법 섹션을 참조하세요.

    참고

    현재는 기본 이미지의 오버라이드만 지원되며 기본 이미지가 제공하는 것과 다른 유형의 완전히 새로운 커널을 도입하는 것은 지원되지 않습니다. AWS

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

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

    자세한 내용은 가상 클러스터의 대화형 엔드포인트 생성을 참조하세요.

  3. EMR Studio를 통해 대화형 엔드포인트에 연결합니다. 자세한 내용은 Studio에서 연결을 참조하세요.

다중 아키텍처 이미지 작업

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

EKS 기반 Amazon EMR 사용자 지정 이미지는 중력자 기반 EC2 인스턴스와 AWS 비중력자 기반 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
  2. 다중 아키텍처 이미지를 빌드하려면 Introducing multi-architecture container images for Amazon ECR의 지침을 따릅니다.

    참고

    arm64 인스턴스에서 arm64 이미지를 생성해야 합니다. 마찬가지로 amd64 인스턴스에서 amd64 이미지를 빌드해야 합니다.

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

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