Skip to main content

Hail - AWS Glue


 

여기서는 Hail을 VCF to Parquet 목적으로 사용하는 법을 설명합니다.

스크린샷이 첨부된 버전은 여기서 확인할 수 있습니다.

사전 준비

  1. hail-all-spark.jar 파일을 다운로드 받습니다.

  2. Amazon S3 서비스로 접속해서 앞에서 다운로드 받은 hail-all-spark.jar 파일을 본인에 알맞은 버킷에 업로드합니다.

 

    업로드한 hail-all-spark.jar 파일을 선택하고 Copy S3 URL을 눌러 주소를 복사합니다.


    이 복사한 주소는 다음 섹션에서 다룰 AWS Glue의 노트북 작업 코드에 필요합니다.

    AWS IAM

    IAM 서비스로 진입하여 정의된 Role 을 수정합니다. GenomicsAnalysis-Genomics-JobRole-* 으로 검색하여 나오는 Role에 대해서 2가지 Policy를 추가할 것입니다.

    GetRole, PassRole

    1. Create inline policy 를 클릭합니다.
    2. 다음과 같이 Policy를 JSON을 선택해서 작성합니다. 이때 반드시 {account-id}는 본인의 AWS 계정아이디와 {GenomicsAnalysis-Genomics-JobRole-*}은 해당되는 것으로 변경해서 작성합니다.
    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Sid": "Statement1",
    			"Effect": "Allow",
    			"Action": [
    				"iam:GetRole",
    				"iam:PassRole"
    			],
    			"Resource": [
    				"arn:aws:iam::**{account-id}**:role/**{GenomicsAnalysis-Genomics-JobRole-*}**"
    			]
    		}
    	]
    }
    
    1. 작성한 커스텀 정책의 이름을 입력하고 Create policy를 클릭합니다.
    2. 아래와 같이 방금 만든 정책이 해당 Role에 추가된 것을 확인할 수 있습니다. (여기서는 MyGluePolicy)

    S3 Read

    1. 이번에는 사전 정의된 정책을 첨부하여 추가해보겠습니다. Add permissions > Attach policies
    2. AmazonS3ReadOnlyAccess 정책을 검색하여 선택합니다.
    3. 최종적으로 아래와 같이 2개의 Policy가 2개더 추가된 것을 확인할 수 있습니다. (여기서는 MyGluePolicy , AmazonS3ReadOnlyAccess)


    AWS Glue

    1. 콘솔을 통해 AWS Glue 서비스에 접속합니다.
    2. ETL jobs > Notebook 을 클릭해서 새로운 노트북을 생성합니다.

    이때 IAM role 은 사전에 생성되어 있는 GenomicsAnalysis-Genomics-JobRole-* 를 선택합니다.

    1. Glue notebook 창으로 돌아와 아래 코드를 모두 붙여 넣습니다. hail-all-spark.jar의S3 URI 새로운 셀을 추가하려면 원하는 위치에서 +를 눌러 추가할 수 있습니다.


    %idle_timeout 2880
    %glue_version 4.0
    %worker_type G.1X
    %number_of_workers 5
    %additional_python_modules hail
    %extra_jars "**{본인의 버킷에 업로드한 hail-all-spark.jar의 S3 URI}**"
    %%configure
    {
        "--conf": "spark.serializer=org.apache.spark.serializer.KryoSerializer --conf spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator"
    }
    
    
    import sys
    from pyspark.context import SparkContext
    from awsglue.context import GlueContext
    from awsglue.job import Job
    
    import hail as hl
    
    sc = SparkContext.getOrCreate()
    hl.init(sc=sc)
    
    glueContext = GlueContext(sc)
    spark = glueContext.spark_session
    job = Job(glueContext)
    
    job.init("JobNameEx")
    
    vds = hl.import_vcf("s3://**{본인의 버킷명}**/genomics-tertiary-analysis-and-data-lakes-using-aws-glue-and-amazon-athena/latest/variants/vcf/variants.vcf.gz", force_bgz=True, reference_genome='GRCh38')
    
    vds.make_table().to_spark().write.mode('overwrite').parquet("s3://**{본인의 버킷명}**/genomics-tertiary-analysis-and-data-lakes-using-aws-glue-and-amazon-athena/latest/variants/vcf_to_parquet")
    
    job.commit()
    
    1. 이제 S3 콘솔로 접속하여 결과 Parquet이 잘 만들어졌는지 확인합니다.


    Optional 단계

    • 해당 데이터를 S3의 Query with S3 Select 기능을 사용해 쿼리해봅니다.
    • 해당 데이터를 AWS Glue 크롤러를 만들어 카탈로깅해봅니다. 그리고 Athena 에서 쿼리해 볼 수 있습니다.