이번 주는 "데이터를 어떻게 변환하고, 어떻게 흐름을 조율하며, 어떻게 싸고 빠르게 만드는가"를 다뤘다. Week 4까지의 Glue가 서버리스 ETL의 기본이었다면, Week 5는 그 주변을 둘러싼 더 큰 도구 상자다 — 대규모 처리를 위한 EMR, 경량 이벤트 처리를 위한 Lambda, 흐름을 엮는 오케스트레이션, 그리고 모든 것을 관통하는 성능·비용 최적화다. 오늘은 이 네 축을 하나의 의사결정 지도로 다시 묶는다.
EMR에서 반드시 기억할 점: Core 노드(저장+연산)는 온디맨드, Task 노드(연산 전용)는 스팟. 영구 데이터는 S3(EMRFS)에 두고 Transient 클러스터로 작업 시에만 띄워 비용을 아낀다. HDFS는 임시 저장소다.
🎯 시나리오: 한 회사의 파이프라인을 설계한다. (1) IoT 기기가 S3에 작은 JSON을 끊임없이 올린다 → Lambda가 도착 즉시 정제. (2) 매일 새벽 누적 데이터를 대규모 집계 → EMR Transient(스팟 Task) 또는 Glue. (3) 결과를 분석용으로 저장 → Parquet + 날짜 파티션. (4) 전체 흐름 조율 → Step Functions. 각 도구가 강점 영역에서만 쓰인다는 점이 핵심이다.
세 도구가 모두 DAG를 쓰는 이유는 비순환 그래프가 위상 정렬 가능해 "의존성 충족 순서"로 실행하고 독립 작업을 병렬화할 수 있기 때문이다. 오케스트레이션은 결국 "DAG를 정의하고 실행 보장(재시도·멱등성·가시성)을 제공하는 일"이며, 세 도구는 그 실행 보장을 각각 서버리스/표준Airflow/Glue내장 방식으로 제공한다.
파티셔닝: 자주 필터하는 저카디널리티 컬럼(날짜·지역). 고카디널리티 금지(작은 파일 폭증)
파일 크기: 128MB~1GB로 컴팩션. 작은 파일 수만 개는 오버헤드 지옥
포맷 구분 한 줄 요약: 분석 쿼리 = Parquet/ORC(열 기반), 스키마 진화·빠른 쓰기 = Avro(행 기반).
⚠️ 함정: 최적화 문제는 보통 여러 처방을 동시에 요구한다. "Athena 비용 급증" 시나리오의 정답은 "Parquet으로 바꾼다" 하나가 아니라 포맷 전환 + 파티셔닝 + 컴팩션의 조합인 경우가 많다. 보기에서 "가장 효과적인 단일 조치"를 물으면 포맷(열 기반) 또는 파티셔닝이 보통 1순위지만, "모두 적용하라"형 문제도 나온다.
엔진 선택 문제의 오답은 대개 한도에 걸려서 탈락한다. 네 엔진을 같은 항목으로 놓고 본다.
항목
Lambda
Glue Spark Job
EMR on EC2
EMR Serverless
실행 단위
함수 호출
Job 실행
클러스터 + Step
애플리케이션 + Job 실행
시간 한도
호출당 15분
타임아웃 설정(최대 7일)
클러스터가 떠 있는 동안
Job 실행 단위
메모리
128MB~10,240MB
워커 유형이 결정(G.1X는 16GB)
인스턴스 타입이 결정
워커 크기가 결정
유휴 비용
없음
없음
클러스터가 떠 있으면 발생
없음(사전 초기화 용량을 두면 발생)
상주 서비스(HBase 등)
불가
불가
가능
불가(Spark·Hive 작업 실행용)
세부 튜닝·스팟 제어
메모리 설정 정도
워커 유형·수
인스턴스·스팟·설정 전부
워커 크기·용량 한도
Lambda의 나머지 한도도 같이 묶어 둔다. /tmp 임시 저장소는 512MB~10,240MB, 페이로드는 동기 6MB·비동기 1MB다(비동기 한도는 오랫동안 256KB였으므로 시험 자료에는 256KB로 나올 수 있다). CPU는 메모리에 비례해 배정되므로 CPU가 모자란 함수는 메모리를 올려야 빨라진다.
EMR Serverless의 사전 초기화 용량은 워커를 미리 데워 두어 작업을 몇 초 안에 시작하게 해 주지만, 그만큼 유휴 비용이 생긴다. "간헐적 배치, 유휴 비용 없음"이 조건이면 켜지 않는다.
"30분 걸리는 단일 파일 변환"은 데이터가 작아도 Lambda로는 안 된다. 크기가 아니라 시간 한도가 탈락 사유다.
⚠️ 함정: 재시도를 여러 계층에 겹쳐 두면 곱해진다. Step Functions의 Retry 3회와 Glue Job 자체의 재시도 3회를 함께 걸면, 한 번의 장애에 Job이 최대 16번 실행될 수 있다. 재시도는 한 계층(보통 오케스트레이터)에만 두고, 재실행되어도 결과가 같도록 출력은 덧붙이기가 아니라 파티션 단위 덮어쓰기로 설계한다.
스팟 Task 노드가 안전하다는 말의 전제. Task 노드는 HDFS DataNode를 돌리지 않으므로 회수되어도 데이터는 잃지 않는다. 하지만 작업을 지휘하는 YARN 애플리케이션 마스터가 그 노드에 올라가 있었다면 작업 자체가 실패한다. EMR 6.x부터는 애플리케이션 마스터가 Core·Task 어디에나 올라갈 수 있는 것이 기본값이므로, 스팟 비중이 크면 노드 레이블로 Core(또는 온디맨드) 노드에만 두도록 설정한다.
Primary 노드는 3대로 구성해 고가용성을 확보할 수 있다. 1대 구성에서는 Primary가 단일 장애점이다. 스팟으로 두면 안 되는 이유다.
Managed Scaling은 최소·최대 용량만 정해 두면 EMR이 지표를 보고 Core·Task 노드를 늘리고 줄인다. YARN 기반 애플리케이션(Spark·Hive·Flink 등)에만 동작하고 Presto·HBase에는 적용되지 않는다. Primary 노드는 조정 대상이 아니다.
Instance Fleets는 구매 옵션과 인스턴스 타입의 혼합이 기본 기능이라 스팟 용량 확보에 유리하다. Instance Groups는 그룹마다 타입과 구매 옵션이 하나씩이다.