개발/Spark

EMR Serverless 외부 라이브러리 참조 방법

wonpick 2025. 3. 28. 12:08

ecr , 가상환경 압축 후 s3업로드 등등 이있다. 그중 가상환경을 압축하여 전달할 수 있는 방법 소개한다.

1. 사전 준비 사항 

  • AWS CLI가 설치 및 설정되어 있어야 합니다. (로컬에서 하는 경우) 
  • Python(3.9 등 사용 버전) 및 virtualenv 또는 venv 모듈이 사용 가능한 환경이어야 합니다. 
  • 동일한 CPU 아키텍처에서 작업을 진행해야 합니다. 예를 들어, AWS EMR Serverless의 노드가 ARM64 아키텍처라면, 동일한 ARM64 머신(예: Graviton 시리즈(Amazon Linux 2/2023))에서 가상환경을 생성해야 합니다. 
 

이제는 개발자도 CPU 아키텍처를 구분해야 합니다.

Intel 천지였던 PC 분야에 ARM이 광풍을 불기 시작한지 얼마 되지 않았습니다.이에 개발자도 변화를 감지 하고 대응하기 위해 알아야 할 것들을 정리 했습니다.그동안 암묵적으로 대부분의 서버 환

velog.io

 

항목 x86_64 (AMD/Intel) ARM64 (ARM)
명령어 집합 CISC 기반 RISC 기반
성능 단일 코어 성능이 높고, 데스크톱/서버에서 전통적으로 강점 코어 수 증가, 전력 효율 우수, 다중 코어 활용에 강점
전력 소모 상대적으로 높음 상대적으로 낮음
소프트웨어 호환 매우 폭넓은 호환성 최근 빠르게 확대 중, 일부 에뮬레이션 필요
주요 사용처 전통적 데스크톱, 노트북, 서버(Windows/리눅스/맥 인텔 기반) 모바일(스마트폰/태블릿), 임베디드,
저전력 서버(AWS Graviton), 리눅스, 애플 M 시리즈 맥

 

2. 가상환경 생성 및 라이브러리 설치 

다음은 ARM64 환경을 예로 들어 설명합니다. x86_64 아키텍처라면 동일한 방식으로 진행하되 머신 아키텍처만 맞추시면 됩니다.

# Python 3.9 기준 예시
python3.9 -m venv brotli_env
source brotli_env/bin/activate

# 필요한 라이브러리 설치 (예: brotli)
pip install brotli

Spark 작업에서 사용하고 싶은 Python 라이브러리가 있다면 모두 여기에서 설치해두면 됩니다.

 

3. 가상환경 폴더 내부 압축하기 및 S3 업로드 

<경로 중복 방지!!!> 

가상환경 폴더 자체를 통째로 tar.gz로 압축하면, Spark에서 --archives 옵션으로 압축 파일을 풀었을 때 경로가 이중으로 잡히는 문제가 발생할 수 있습니다.

 

  • 예를 들어, brotli_env라는 폴더를 통째로 압축하면, 압축 해제 시 brotli_env/brotli_env/처럼 경로가 중복될 수 있습니다.

이를 방지하기 위해, 가상환경 폴더 내부의 파일들과 서브 폴더만 압축해야 합니다.

 

# brotli_env 폴더 내부로 이동
(brotli_env) [ec2-user@dawon test]$ cd brotli_env/
# 폴더 내부의 모든 내용(.* 포함)을 tar.gz로 압축
# (.*까지 포함하려면 숨김 파일/폴더까지 확인 필요)
(brotli_env) [ec2-user@dawon brotli_env]$ tar -czf ../brotli_env_arm64.tar.gz *
# 현재 디렉토리를 벗어나기
(brotli_env) [ec2-user@dawon brotli_env]$ cd ..
#brotli_env 폴더 구조를 유지하면서, 압축 해제 시 디렉토리 중복안됨
(brotli_env) [ec2-user@dawon test]$ ls
brotli_env  brotli_env_arm64.tar.gz

#Amazon S3 버킷에 업로드
(brotli_env) [ec2-user@dawon test]$ aws s3 cp brotli_env_arm64.tar.gz s3://bucket/

이 과정을 거치면 brotli_env_arm64.tar.gz 압축 파일이 생성됩니다. 이 파일은 기존 brotli_env 폴더 구조를 유지하면서, 압축 해제 시 현재 디렉터리에 그대로 내용이 풀리게 됩니다. 

  • 이렇게 해야지 경로가 아래와 같이 할당 됨 ['./brotli_env/bin', './brotli_env/lib64']
    -> 이전에는 ['./brotli_env/brotli_env/bin', './brotli_env/brotli_env/lib64']

 

4. EMR Serverless Spark 작업 제출 

 

Spark Submit과 유사한 방식으로, EMR Serverless에서는 --archives 옵션을 통해 Python 가상환경 압축 파일을 넘길 수 있습니다. 

  • --archives s3://<버킷명>/brotli_env_arm64.tar.gz#brotli_env 
    -> 이 옵션은 압축 파일을 brotli_env 디렉터리로 풀겠다는 의미입니다. 
  • Spark 실행 시 spark.emr-serverless.driverEnv.PYTHONPATH와 spark.executorEnv.PYTHONPATH를 설정해 Python 라이브러리를 찾을 수 있도록 합니다. 
  • spark.emr-serverless.driverEnv.PYSPARK_PYTHON, spark.executorEnv.PYSPARK_PYTHON 환경 변수를 가상환경의 Python 바이너리 경로로 지정해야 합니다.
#cli 예시
aws emr-serverless start-job-run\
     --application-id {app id}     \
     --execution-role-arn {arn}     \
     --job-driver '{                                                                                                                                                                                
        "sparkSubmit": {
            "entryPoint": "s3://bucket/import_brotli.py",
            "sparkSubmitParameters": \
            "--archives s3://bucket/brotli_env_arm64.tar.gz#brotli_env\
              --conf spark.emr-serverless.driverEnv.PYTHONPATH=./brotli_env/lib/python3.9/site-packages\
               --conf spark.executorEnv.PYTHONPATH=./brotli_env/lib/python3.9/site-packages\
                --conf spark.emr-serverless.driverEnv.PYSPARK_PYTHON=./brotli_env/bin/python3.9\
                 --conf spark.executorEnv.PYSPARK_PYTHON=./brotli_env/bin/python3.9"
        }
    }'