datalake for rental vehicles store using EMR, S3, and Athena
Step Functions로 EMR 작업과 S3 데이터 레이크 구축을 자동화
Tech Stack
- S3: 데이터 저장 계층 및 데이터 레이크 역할 (Raw 및 transformed 데이터 보관)
- EMR(Spark): 분산 환경에서 대용량 데이터를 처리 및 변환하는 연산 엔진
- Glue: S3에 저장된 데이터의 스키마를 추론하고 메타데이터를 관리
- Athena: s3에 저장된 변환 데이터를 표준 SQL 쿼리로 분석
- Step Functions: 전체 워크플로우를 자동화하는 오케스트레이션 도구
Datasets
마켓플레이스 운영에 필요한 네 가지 핵심 데이터를 처리
- Vehicles: 대여 가능한 모든 차량 정보
- Users: 플랫폼에 가입된 사용자 정보
- Locations: 대여 및 반납 위치에 대한 마스터 데이터
- Rental Transactions
- 사용자 ID, 차량 ID, 대여 시작/종료일
- 대여/반납 장소, 결제 총액 등 핵심 활동 정보
Workflow
EMR(Elastic MapReduce) : 분산 컴퓨팅 관리 서비스
- Master Node: 작업을 기획하고, 어떤 데이터를 어떤 팀원에게 보낼지 결정
- Core/Task Nodes: 실제로 CPU와 메모리를 풀가동해서 데이터를 계산(Spark 실행)
Step Functions가 모든 과정을 제어, 비용 최적화를 위해 Transient EMR 클러스터 방식을 채택
- 클러스터 생성: Step Functions가 EMR 클러스터를 동적으로 생성
- Spark 작업 실행
- 두 개의 Spark Job이 독립적 또는 순차적으로 실행
- S3의 Raw 데이터를 읽어 지표 산출 및 데이터 변환 수행
- 데이터 저장: 변환된 결과물을 다시 s3 버킷에 저장
- 스키마 추론: Glue Crawler가 S3의 결과물을 스캔하여 데이터 카탈로그 생성
- 데이터 분석: 사용자는 Athena를 통해 S3 데이터를 즉시 SQL로 조회
EMR(Elastic MapReduce)
AWS 클라우드에서 오픈소스 도구들을 사용해 대규모 데이터를 처리하는 관리형 빅데이터 플랫폼
- 정체성
- 클라우드 환경에 최적화된 빅데이터 처리 파이프라인을 제공
- Hadoop, Spark, Sqoop, Apache HBase 등 업계 표준 도구들을 복잡한 설정 없이 바로 사용 가능
- 하드웨어 프로비저닝이나 소프트웨어 설치 같은 번거로운 작업을 AWS가 대신 처리해 주어 운영이 단순해짐
- 강점
- 작업량에 따라 클러스터의 노드를 죽시 추가(scale out)하거나 제거(scale in)할 수 있어 효율적
- 실제로 작업을 수행하는 실행 시간 동안 사용한 리소스에 대해서만 비용을 지불
Athena
S3에 저장된 데이터를 표준 SQL을 사용해 즉시 분석할 수 있게 해주는 서버리스 대화형 쿼리 서비스
- 특징
- serverless
- fully managed: 리소스 확장(scaling), 인덱싱, 스토리지 설정 등을 AWS가 알아서 처리하므로 운영 부담이 매우 적음
- s3 직접 쿼리: 데이터를 별도의 데이터베이스로 옮길 필요 없이 s3에 있는 상태 그대로 쿼리를 날릴 수 있음
- 비용 모델 및 최적화
- pay-as-you-go: 실행한 쿼리가 스캔한 데이터 양에 따라서만 비용이 발생
- 비용 절감 전략: 스캔하는 데이터 양을 줄일수록 비용이 저렴해짐
- 데이터 압축: 파일 크기를 줄여 스캔량 감소
- 파티셔닝: 필요한 범위의 데이터만 골라 읽기
- 컬럼형 포맷: parquet이나 ORC 같은 형식을 사용해 필요한 열만 읽기
Hot Data, Warm Data, Cold Data
- Hot Data(매우 자주 발생, 빠른 응답 필요)
- 밀리초(ms) 단위의 응답이 필요하고, 서비스 운영 중에 실시간으로 읽고 쓰는 데이터
- RDS, DynamoDB 가 적합
- Warm Data(가끔 분석이 필요)
- 매번 쓰지는 않지만, 주 단위 보고서를 뽑거나 특정 이슈를 조사할 때 대량으로 훑어봐야 하는 데이터
- Athena, Redshift Spectrum 이 적합
- why Athena?
- 서버를 24시간 켜둘 필요가 없이 보관료(s3)만 내면 됨
- 분석하고 싶을 때만 SQL을 날리면 되니 IO가 가끔 발생하는 상황에서 가성비가 압도적
- Cold Data(거의 안 봄, 보관용)
- 법적 증거 자료나 1년 전 로그처럼 거의 열어보지 않는 데이터
- S3 Glacier 이 적합
Execute Pyspark using Docker locally
로컬 검증의 목적
- 오류 방지: EMR은 클러스터를 띄우는 데 비용과 시간이 들기 때문에, 로컬에서 Syntax error, 컬럼명 오타, 변환 로직 등을 미리 확인
- 디버깅: df.show() 를 통해 중간 결과물을 즉시 확인하며 로직의 정확성을 검토
첫번째 Spark Job(spark_agg_1.py) : User와 Transaction 데이터를 결합하여 활동 기반 지표 생성
- 사용 데이터:
rental_transactions.csv,users.csv
- 주요 변환
- 대여 시작/종료 시간을 Timestamp 타입으로 변환
- duration(대여 기간) 컬럼 생성
- 거래 데이터와 사용자 데이터를 Join
- 산출물
- 날짜별 지표: 일자별 총 거래 수, 총 매출액, 평균 거래액, 최대/최소/평균 대여 기간
- 사용자별 지표: 사용자당 총 거래 수, 총 지출액, 평균 지출액, 최대/최소 지출액
두번째 Spark Job(spark_agg_2.py) : Location, Vehicle, Transaction 데이터를 결합
- 사용 데이터:
rental_transactions.csv,locations.csv,vehicles.csv
- 주요 변환
- 세가지 데이터프레임을 한 번에 Join
- 첫번째 작업과 동일한 시간 타입 변환 및 기간 산출
- 산출물
- 장소별 성능: 각 위치에서의 총 매출, 거래 수, 평균/최대/최소 거래액, 해당 장소에서 이용된 고유 차량 수
- 차량 타입별 지표: 차량 종류별 총 매출, 거래 수, 평균 거래액, 평균 대여 기간
로컬 검증 결과
Spark Jobs를 AWS EMR 클라우드 환경에서 실행
EMR 클러스터 생성
Spark 코드가 돌아갈 컴퓨터 군단인 클러스터를 준비
- 클러스터 이름:
Spark Job Cluster
- 소프트웨어 설정:
- EMR 버전: 7.1.0
- 애플리케이션: Spark만 선택 (불필요한 기능 제외)
- 하드웨어 설정:
- 인스턴스 타입:
m5.xlarge(기본값 사용) - 스토리지: 15 GB
- 상태 변화:
Starting(시작 중) →Waiting(대기 중: 작업 실행 가능 상태)
IAM Roles 설정
EMR이 다른 AWS 서비스(S3 등)에 접근할 수 있도록 두 가지 핵심 권한 설정
| 역할 이름 | 역할 (Role) | 설명 |
| EMR 서비스 역할 | EMR_Custom_Service_Role | EMR 서비스 자체가 다른 AWS 서비스를 제어하기 위한 권한 |
| EC2 인스턴스 프로필 | EMR_EC2_Custom_Role | 클러스터를 구성하는 개별 EC2 서버들이 갖는 권한 (S3 읽기/쓰기 등) • AmazonEMRFullAccessPolicy_v2 이것도 policy 추가 |
Spark 스크립트 준비(S3 배포)
로컬에서 테스트하던 코드를 클라우드용으로 수정하여 S3에 업로드
S3 버킷 내
작업 실행: Step 추가
EMR에서 애플리케이션을 실행하는 단위인 Step을 등록
- Step1 추가
- 타입: Spark Application
- 위치: S3에 올린 첫 번째 스크립트 경로 입력
- Step2 추가
- 위치: 두번째 스크립트 경로 입력
- 실행: 등록 즉시
Running상태가 되며 순차적으로 실행됨
- 결과 확인
Glue crawlers for data catalog and Athena
data catalog
데이터가 실제로 어디에 있는지, 어떤 모양인지에 대한 metadata를 모아놓는 중앙 저장소
glue crawler
s3 같은 데이터 저장소를 직접 돌아다니며 데이터를 분석하고, 그 결과를 data catalog에 적어주는 자동화 도구
각 폴더별로 crawler run
athena query editor로 조회
Step functions code walkthrough and deployment
지금까지 수동으로 진행해본 EMR 클러스터 생성, 작업 실행, 종료 과정을 AWS Step Functions를 통해 하나의 자동화된 파이프라인으로 구축
- Step Functions 워크플로우
- Create EMR Cluster: EMR 7.1.0 버전,
m5.xlarge인스턴스(마스터 1대, 코어 2대)를 사용하여 클러스터를 동적으로 생성 - Spark Job 1: 생성된 클러스터 ID를 받아 첫 번째 PySpark 스크립트(
spark_1.py)를 실행 - Spark Job 2: 첫 번째 작업이 성공하면 두 번째 스크립트(
spark_2.py)를 실행 - Terminate Cluster: 모든 작업이 끝나면(성공 혹은 실패 시에도) 클러스터를 즉시 종료하여 비용을 절감
cluster 종료까지 완료
EMR Serverless
인프라를 직접 구성하거나 관리할 필요 없이 애플리케이션만 실행하는 서버리스 서비스
EMR Studio 및 애플리케이션
- EMR Studio: 애플리케이션을 생성하고 관리하는 공간
- Application 생성
- 이름:
spark-batch-jobs(예시) - 유형: Spark
- 버전: 7.1.0 (이전 실습과 동일한 버전 사용)
전용 IAM Role
custom trus policy
- s3 Full Access
- serverless vs provisioned
| 비교 항목 | EMR (Provisioned/EC2) | EMR Serverless |
| 복잡성 | 노드 개수, 인스턴스 사양 직접 결정 | AWS가 관리하여 매우 간편 |
| 비용 예측 | 사용한 시간만큼 정액제 (예측 쉬움) | 사용량에 따라 자동 과금 (더 비쌀 수 있음) |
| 확장성 | 고정된 리소스 (수동 조절) | 수요에 따른 자동 확장/축소 |
| 비즈니스 가치 | 저렴한 비용으로 꾸준한 처리 | 빠른 실행 속도와 편의성 |