Amazon Web Services 한국 블로그

Amazon EMR on EKS, Apache Spark 애플리케이션을 위한 컨테이너 종속성 맞춤 조정 및 패키징 기능 출시

지난 AWS re:Invent에서 Amazon EMR on Amazon Elastic Kubernetes Service(Amazon EKS) 정식 출시 소식을 발표한 바 있습니다. 이 서비스는 Amazon EMR의 새 배포 옵션으로, 고객이 Amazon EKS에서 Apache Spark 프로비저닝과 관리를 자동화할 수 있게 해줍니다.

Amazon EMR on EKS를 사용하면 고객이 EMR 애플리케이션을 다른 유형의 애플리케이션과 같은 Amazon EKS 클러스터에 배포할 수 있으므로 자사 모든 애플리케이션의 리소스를 공유하고 한 솔루션에서 표준화하여 애플리케이션을 운영 및 관리할 수 있습니다. Kubernetes에서 Apache Spark를 실행하는 고객의 경우 EMR on EKS로 마이그레이션하면 성능 최적화된 런타임, Amazon EMR Studio와의 통합(대화형 작업의 경우), Apache Airflow와의 통합 및 파이프라인 실행을 위한 AWS Step Functions, 그리고 디버깅에 Spark UI를 사용하는 등 다양한 장점을 누릴 수 있습니다.

고객이 작업을 제출하면 EMR이 자동으로 애플리케이션을 빅 데이터 프레임워크를 포함한 컨테이너에 패키징하여 다른 AWS 서비스와 통합하기 좋도록 미리 빌드한 커넥터를 제공합니다. 그런 다음 EMR이 애플리케이션을 EKS 클러스터에 배포하고 작업 실행, 로깅과 모니터링 등을 관리합니다. 현재 Apache Spark 워크로드를 실행하며 다른 Kubernetes 기반 애플리케이션에는 Amazon EKS를 사용 중이라면 EMR on EKS를 사용하여 이들을 같은 Amazon EKS 클러스터에 통합함으로써 리소스 활용도를 개선하고 인프라 관리를 간소화할 수 있습니다.

컨테이너화한 빅 데이터 분석 워크로드를 다루는 개발자로부터 이미지를 그냥 가리키기만 하면 실행되었으면 좋겠다는 의견이 접수되었습니다. 현재 EMR on EKS는 작업 제출 중에 외부에 저장된 애플리케이션 종속성을 동적으로 추가합니다.

오늘은 Amazon EMR on EKS에서 맞춤형 이미지를 지원한다는 기쁜 소식을 알려드립니다. 앞으로는 고객이 EKS 클러스터에서 Apache Spark를 사용해 분석 애플리케이션을 실행하는 Docker 런타임 이미지를 수정할 수 있게 됩니다.

맞춤형 이미지를 사용하면 자체적인 지속적 통합(CI) 파이프라인을 사용해 성능 최적화된 EMR Spark 런타임을 기준으로 애플리케이션과 그 종속성을 둘 다 포함한 컨테이너를 만들 수 있습니다. 이렇게 하면 이미지를 구축하는 데 드는 시간이 절약되고 로컬 개발이나 테스트용 컨테이너 실행을 예측하는 데도 유익합니다.

따라서 이제부터 데이터 엔지니어와 플랫폼 팀이 기본 이미지를 만들어 사내 스탠더드 라이브러리를 추가한 다음 이를 Amazon Elastic Container Registry(Amazon ECR)에 저장할 수 있습니다. 데이터 과학자는 이 이미지를 맞춤 조정하여 애플리케이션별 종속성을 포함할 수 있습니다. 그 결과로 도출되는 변경 불가능한 이미지를 스캔하여 취약성을 검사한 다음, 테스트 및 프로덕션 환경에 배포할 수 있습니다. 이제 개발자가 맞춤형 이미지를 가리키기만 하면 EMR on EKS에서 실행됩니다.

맞춤형 런타임 이미지 – 시작하기
맞춤형 이미지를 시작하려면 AWS Command Line Interface(AWS CLI)를 사용해 다음과 같은 단계를 수행합니다.

  1. EKS 클러스터를 Amazon EMR에 등록합니다.
  2. Amazon ECR에서 EMR이 제공한 기본 이미지를 다운로드한 다음, 각자의 애플리케이션과 라이브러리를 사용해 해당 이미지를 수정합니다.
  3. 맞춤 조정한 이미지를 Amazon ECR과 같은 Docker 레지스트리에 게시한 다음 이미지를 참조하여 작업을 제출합니다.

다운로드할 수 있는 기본 이미지는 다음과 같습니다. 이러한 이미지에는 Spark 런타임이 포함되어 있어 EMR Jobs API를 사용해 배치 워크로드를 실행하는 데 쓸 수 있습니다. 다음은 사용 가능한 최신 이미지 전체 목록입니다.

릴리스 레이블 Spark Hadoop 버전 기본 이미지 태그
emr-5.32.0-latest Spark 2.4.7 + Hadoop 2.10.1 emr-5.32.0-20210129
emr-5.33-latest Spark 2.4.7-amzn-1 + Hadoop 2.10.1-amzn-1 emr-5.33.0-20210323
emr-6.2.0-latest Spark 3.0.1 + Hadoop 3.2.1 emr-6.2.0-20210129
emr-6.3-latest Spark 3.1.1-amzn-0 + Hadoop 3.2.1-amzn-3 emr-6.3.0:latest

이와 같은 기본 이미지는 각 AWS 리전의 Amazon ECR 리포지토리에 있습니다. 여기에는 ECR 레지스트리 계정, AWS 리전 코드, 그리고 미국 동부(버지니아 북부) 리전의 경우 기본 이미지 태그를 조합한 이미지 URI를 포함합니다.

755674844232.dkr.ecr.us-east-1.amazonaws.com/spark/emr-5.32.0-20210129

이제 Amazon ECR 리포지토리에 로그인하여 이미지를 로컬 workspace로 가져옵니다. 네트워크 대기 시간을 줄이려고 다른 AWS 리전에서 이미지를 가져오고자 하는 경우, 미국 서부(오레곤) 리전에서 이미지를 가져오는 리전과 가장 가까운 곳에 상응하는 다른 ECR 리포지토리를 선택합니다.

$ aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
$ docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-5.32.0-20210129

EMR 제공 기본 이미지를 사용해 로컬 workspace에서 Dockerfile을 생성한 다음 명령을 추가하여 이미지를 맞춤 조정합니다. 애플리케이션에 맞춤 Java SDK, Python이나 R 라이브러리가 필요한 경우, 다른 컨테이너화된 애플리케이션과 마찬가지로 이미지에 직접 추가할 수 있습니다.

다음의 Docker 명령 예시는 Spark와 Pandas를 사용한 자연어 처리(NLP)와 같은 유용한 Python 라이브러리를 설치하고자 하는 사용 사례에 적합합니다.

FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-5.32.0-20210129
USER root
### 여기에 맞춤 조정 추가 ####
RUN pip3 install pyspark pandas spark-nlp // Install Python NLP Libraries
USER hadoop:hadoop

다른 사용 사례의 경우, 앞서 언급했듯이 다른 버전의 Java를 설치할 수 있습니다(예: Java 11).

FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-5.32.0-20210129
USER root
### 여기에 맞춤 조정 추가 ####
RUN yum install -y java-11-amazon-corretto // Install Java 11 and set home
ENV JAVA_HOME /usr/lib/jvm/java-11-amazon-corretto.x86_64
USER hadoop:hadoop

Java 버전을 11로 변경하는 경우, Java Virtual Machine(JVM) 옵션도 Spark로 변경해야 합니다. 작업을 제출할 때 applicationConfiguration에 다음과 같은 옵션을 제공하세요. 이러한 옵션이 필요한 이유는 Java 11에서 지원하지 않는 Java 8 JVM 파라미터도 있기 때문입니다.

"applicationConfiguration": [ 
  {
    "classification": "spark-defaults",
    "properties": {
        "spark.driver.defaultJavaOptions" : "
		    -XX:OnOutOfMemoryError='kill -9 %p' -XX:MaxHeapFreeRatio=70",
        "spark.executor.defaultJavaOptions" : "
		    -verbose:gc -Xlog:gc*::time -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
			-XX:OnOutOfMemoryError='kill -9 %p' -XX:MaxHeapFreeRatio=70 
			-XX:+IgnoreUnrecognizedVMOptions"
    }
  }
]

EMR on EKS에 맞춤형 이미지를 사용하려면 맞춤형 이미지를 게시한 다음 이용 가능한 Spark 파라미터를 사용하여 Amazon EMR on EKS에 Spark 워크로드를 제출합니다.

맞춤형 Spark 이미지를 사용하여 배치 워크로드를 제출할 수 있습니다. StartJobRun API나 CLI를 사용하여 배치 워크로드를 제출하려면 spark.kubernetes.container.image 파라미터를 사용하세요.

$ aws emr-containers start-job-run \
    --virtual-cluster-id <enter-virtual-cluster-id> \
    --name sample-job-name \
    --execution-role-arn <enter-execution-role-arn> \
    --release-label <base-release-label> \ # Base EMR Release Label for the custom image
    --job-driver '{
        "sparkSubmitJobDriver": {
        "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar",
        "entryPointArguments": ["1000"],
        "sparkSubmitParameters": [ "--class org.apache.spark.examples.SparkPi --conf spark.kubernetes.container.image=123456789012.dkr.ecr.us-west-2.amazonaws.com/emr5.32_custom"
		  ]
      }
  }'

kubectl 명령을 사용하여 작업이 맞춤형 이미지를 실행 중인지 확인합니다.

$ kubectl get pod -n <namespace> | grep "driver" | awk '{print $1}'
Example output: k8dfb78cb-a2cc-4101-8837-f28befbadc92-1618856977200-driver

Driver 포드의 메인 컨테이너 이미지를 가져옵니다(jq 사용).

$ kubectl get pod/<driver-pod-name> -n <namespace> -o json | jq '.spec.containers
| .[] | select(.name=="spark-kubernetes-driver") | .image '
출력 예시: 123456789012.dkr.ecr.us-west-2.amazonaws.com/emr5.32_custom

Amazon EMR 콘솔의 작업을 보려면 EMR on EKS 아래에서 [Virtual 클러스터]를 선택하세요. 가상 클러스터 목록에서 로그를 확인하고자 하는 가상 클러스터를 선택합니다. [작업 실행] 테이블에서 [로그 보기]를 선택하면 작업 실행의 세부 정보를 볼 수 있습니다.

CI 프로세스와 워크플로 자동화
이제 EMR 제공 기본 이미지를 맞춤 조정하여 애플리케이션을 포함하여 애플리케이션 개발과 관리를 간소화할 수 있습니다. 맞춤형 이미지를 사용하면 기존 CI 프로세스를 사용해 종속성을 추가할 수 있고, 이렇게 하면 Spark 애플리케이션 및 그 종속성 모두를 포함한 단 하나의 변경 불가능한 이미지를 만들 수 있습니다.

Amazon EMR 이미지에는 취약성 스캔과 같은 기존 개발 프로세스를 적용할 수 있습니다. 또한 EMR 검증 툴을 사용해 파일 구조와 런타임 버전이 올바른지 검증할 수 있으며, 이 툴은 로컬로 실행할 수도 있고 CI 워크플로에 통합할 수도 있습니다.

Amazon EMR on EKS의 API는 AWS Step Functions 및 AWS Managed Workflows for Apache Airflow(MWAA)와 같은 오케스트레이션 서비스에 통합되어 있어 자동 워크플로에 EMR 맞춤 이미지를 포함할 수 있습니다.

지금 이용 가능
이제 Amazon EMR on EKS가 제공되는 모든 AWS 리전에서 맞춤형 이미지를 설정할 수 있습니다. 맞춤형 이미지에는 추가 요금을 부과하지 않습니다. 자세한 정보를 알아보려면 Amazon EMR on EKS 개발 가이드를 참조하시고, Amazon EMR on EKS에서 Spark 작업을 실행하는 데 쓸 나만의 이미지를 빌드하는 법을 소개한 데모 동영상도 시청하세요.

Amazon EMR의 AWS 포럼을 통해서나 평소 이용하는 AWS Support 연락처를 통해 피드백을 보내주시기 바랍니다.

Channy