3 분 소요

Hail on Amazon EMR Severless

온프레미스(On-premise) 환경보다 클라우드(Cloud) 환경에서 더욱 Hail의 장점은 극대화됩니다. Hail에서는 Google Cloud Platform, Microsoft Azure의 경우 built-in tools가 존재하고 다른 클라우드 서비스에서도 Apache Spark 버전에 맞추어 Hail의 Git repository에서 Hail을 build하여 사용할 수 있습니다.

저는 클라우드 환경으로 주로 AWS를 사용하고 있어서 Spark가 탑재되어 있는 플랫폼인 Amazon EMR에 Hail 어플리케이션을 설치하여 실행합니다. EMR은 EMR 파일 시스템(EMRFS)을 통해 S3를 바로 이용할 수 있기 때문에 EC2 인스턴스로 처리를 한 뒤 따로 S3 bucket에 올리는 귀찮은 작업을 하지 않아도 됩니다. 또한 클라우드의 장점인 확장성을 이용하여 Task의 load가 큰 경우에 Worker 노드를 추가적으로 확보하는 Auto-scaling 방법을 통해 빠르게 작업을 처리할 수 있습니다.

Amazon EMR
< Amazon EMR >


최근에는 클라우드에서 Serverless 컴퓨팅 서비스를 제공하고 있습니다. Serverless 컴퓨팅 서비스는 사용자는 필요한 만큼의 리소스를 사용할 수 있도록 해주고, 작업이 끝나면 애플리케이션은 자동으로 종료되기 때문에 비용 면에서 효율적입니다. 일례로 AWS Lambda를 들 수 있는데, Lambda는 서버를 배포 또는 관리하지 않고도 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있습니다.

이 Serverless 컴퓨팅 서비스가 2022년에 EMR에도 적용이 되었습니다. EMR Serverless 서비스는 리소스를 자동으로 확장 및 축소하여 애플리케이션에 적합한 용량을 제공합니다. 우리가 해야 할 일은 애플리케이션을 만들고 코드를 넣고 실행하는 것뿐입니다. 그러면 EMR Serverless는 EMR 클러스터를 생성하고 관리하는 데 필요한 모든 작업을 자동으로 처리합니다. 이번 게시글에서는 EMR Serverless를 사용한 Hail 구동 방법에 대해 알아보겠습니다.

1) AWS CLI 설치 및 S3 버킷 생성

우선 EMR Serverless 클러스터를 쉽게 생성하기 위해 AWS CLI를 먼저 설치하겠습니다. AWS CLI를 설치하기 위해서는 AWS CLI doc을 참고하시면 됩니다. 그리고 당연한 말이겠지만 AWS CLI를 사용하기 위해서는 AWS 계정이 필요합니다. AWS 계정을 이용하여 AWS CLI의 설정을 해줍니다.

설정을 하고나면 EMR Serverless 클러스터가 Hail을 구동하는 동안 필요한 저장공간인 S3 버킷을 만들어 줍시다.

aws s3 mb s3://my-emr-serverless-bucket

2) EMR Serverless 작업 실행을 위한 역할 만들기

AWS EMR Serverless doc에서 Create a job runtime role 부분을 참고하여 정책과 그 정책을 포함하는 역할을 만들어 줍니다. 이 역할은 EMR Serverless 클러스터가 Hail을 구동하는 동안 필요한 Amazon 서비스와 리소스에 접근할 수 있도록 해줍니다.

3) EMR Serverless 애플리케이션 생성

AWS CLI emr-serverless create-application 명령어를 통해 EMR Serverless 애플리케이션을 생성합니다. 이 애플리케이션은 EMR 버전, 사용할 애플리케이션 타입, 이름을 설정할 수 있습니다. 현재 시점 기준 Hail은 Spark 3.2.1 버전까지만 지원하고 있습니다. 그래서 Hail을 사용하기 위해서는 EMR 버전을 6.7.0 이하로 설정해야 합니다.

이밖에 애플리케이션의 초기, 최대 리소스를 설정하는 메뉴가 있습니다. 또한 작업이 없을 때 애플리케이션이 자동으로 종료할 수 있도록 설정할 수 있습니다.

aws emr-serverless create-application \
    --release-label emr-6.7.0 \
    --type "SPARK" \
    --name my-spark-application

4) EMR Serverless 클러스터 생성

Hail을 구동하기 위한 클러스터를 만들기 위해서 필요한 파일들이 몇개 있습니다. 우선 EMR의 컴퓨팅 환경과 맞는 Hail JAR과 Hail Python package 파일을 생성해주어야 합니다. 그러기 위해서는 architecture가 같은 EMR의 기본 OS 환경인 Amazon Linux 2에서 Hail을 build해야 합니다. Dockerfile을 이용하여 Hail을 build하고 해당 파일을 생성하는 방법은 제가 정리해둔 Git repository에서 확인할 수 있습니다. Hail을 설치하고 나면 hail-all-spark.jarpyspark_hail.tar.gz 파일이 생성됩니다. 이 파일들을 만들어둔 S3 버킷에 업로드합니다.

aws s3 cp hail-all-spark.jar s3://my-emr-serverless-bucket/archives/
aws s3 cp pyspark_hail.tar.gz s3://my-emr-serverless-bucket/archives/

그리고 또한 repository에 존재하는 hail-script-example.py 파일을 S3 버킷에 업로드합니다. 이 파일은 Hail을 사용하기 위해서 Python module, tmp 디렉토리의 path를 설정하는 코드와 Hail 예시 코드가 들어있는 파일입니다. Python module은 pyspark_hail.tar.gz에서 추출되고 PATH에 추가가 됩니다. tmp 디렉토리를 s3 파일시스템으로 설정하는 이유는 설정하지 않으면 데이터가 각 노드에 파티션 별로 로컬에 저장되기 때문에 다른 노드가 해당 파티션에 접근할 수 없어서 오류가 발생하기 때문입니다. 코드 중 hail_process 함수는 가상의 Matrix Table을 생성하고, GWAS 분석을 수행하고 결과를 저장하는 코드입니다. 해당 함수를 바꾸어 여러분이 원하는 분석을 해볼 수도 있겠네요.

aws s3 cp hail-script-example.py s3://my-emr-serverless-bucket/scripts/

이제 AWS CLI의 aws emr-serverless start-job-run 명령어를 이용해 EMR Serverless 클러스터를 생성합니다. 클러스터 생성 시 필요한 파라미터는 다음과 같습니다.

  • --application-id: 앞에서 생성한 EMR Serverless Application의 ID
  • --execution-role-arn: EMR Serverless 클러스터를 실행할 때 사용할 IAM Role의 ARN
  • --job-driver: EMR Serverless 클러스터를 실행할 때 사용할 Spark Job Driver의 설정
    • entryPoint: Spark Job Driver가 실행할 스크립트의 경로
    • entryPointArguments: Spark Job Driver가 실행할 스크립트에 전달할 파라미터
    • sparkSubmitParameters: Spark Job Driver가 실행할 Spark Job의 설정
      • --archives: Hail의 python package 파일의 경로
      • --jars: Hail의 JAR 파일의 경로
      • --conf: Spark Job의 설정 (Spark Driver의 메모리, Spark Executor의 메모리, Spark Executor의 개수 등)
  • --configuration-overrides: EMR Serverless 클러스터를 실행할 때 사용할 Spark, 로그 설정
    • applicationConfiguration: Hail 구동을 위한 Spark 설정
    • monitoringConfiguration: EMR Serverless 클러스터의 로그 설정

repository에 있는 emr-serverless.sh 파일을 예시로 실행하면 script의 output argument에서 설정한 s3://my-emr-serverless-bucket/output/ 디렉토리에 분석결과인 Hail Table(test.ht)이 저장됩니다. 과정이 진행되는 동안 EMR Serverless 클러스터의 로그는 s3://my-emr-serverless-bucket/logs/ 디렉토리에 저장되기 때문에 바로 확인할 수 있습니다. 예시로 Spark Driver의 로그를 실시간으로 확인하는 코드는 다음과 같습니다.

aws s3 cp s3://my-emr-serverless-bucket/logs/applications/$APPLICfATION_ID/jobs/$JOB_RUN_ID/SPARK_DRIVER/stdout.gz - | gunzip | tail -f

Reference

댓글남기기