ecr , 가상환경 압축 후 s3업로드 등등 이있다. 그중 가상환경을 압축하여 전달할 수 있는 방법 소개한다.
1. 사전 준비 사항
- AWS CLI가 설치 및 설정되어 있어야 합니다. (로컬에서 하는 경우)
- Python(3.9 등 사용 버전) 및 virtualenv 또는 venv 모듈이 사용 가능한 환경이어야 합니다.
- 동일한 CPU 아키텍처에서 작업을 진행해야 합니다. 예를 들어, AWS EMR Serverless의 노드가 ARM64 아키텍처라면, 동일한 ARM64 머신(예: Graviton 시리즈(Amazon Linux 2/2023))에서 가상환경을 생성해야 합니다.
- CPU 아키텍쳐를 이해하는데 도움이 된 글 : 이제는 개발자도 CPU 아키텍처를 구분해야 합니다. (김형섭님)
이제는 개발자도 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"
}
}'
'개발 > Spark' 카테고리의 다른 글
[Spark] Parquet 파일을 읽는 동안 Dataframe의 메타데이터 변경 에러 (0) | 2023.07.16 |
---|---|
[Spark] Spark deploy mode 설정(Cluster/Client) (0) | 2023.03.26 |
[Spark DEBUG] partiton path load 오류 (0) | 2023.02.26 |
[Spark DEBUG] Refresh for Dataframe while reading file 오류 (0) | 2022.11.16 |
[spark] Build step 'Execute shell' marked build as failure 권한 오류 (Permission denied) (0) | 2022.10.05 |