시작하며
프로그래머스 데이터 엔지니어링 강의 7강에서는 CTAS의 단점, Google Sheet 연동, API 및 Airflow 모니터링, DAG 의존성 패턴을 다루고 이어서 Spark의 개요와 아키텍처를 소개한다.

CTAS와 DAG 의존성
CTAS의 단점
- 원본 테이블의 속성들(DEFAULT)이 사라진다.
- 이런 경우에는 단계를 나누어 진행한다.
구글 시트 연동하기
- Google sheet → RedShift table 형태로 연동이 가능하다.
API & Airflow 모니터링
curl -X GET --user "airflow:airflow" http://localhost:8080/healthDAG 의존성
- Explicit trigger: 명시적으로 다른 DAG를 트리거하는 방식
- Reactive trigger: 다른 DAG의 완료를 감지하여 반응하는 방식
Spark 개요
Spark 소개
- MapReduce(Hive/Presto)보다 빠른 성능을 가진다.
- 과거에는 디스크를 쓰는 Hive에 비해 훨씬 빨랐으나, 요즘에는 Spark나 Hive 모두 메모리 & 디스크 양쪽을 지원한다.
- 리소스매니저(YARN, K8s) 위에 올려서 사용한다.
- 요즘은 MapReduce를 사용하지 않는다.
Spark 프로그래밍 API
- RDD(Resilient Distributed DataSet)
- 로우레벨 프로그래밍 API로 세밀한 제어가 가능하다.
- 코딩 복잡도가 증가한다.
- DataFrame & DataSet (판다스 데이터프레임과 흡사)
- 타입정보 명시에 따라, 자유로운 Python의 경우 DataFrame, 명시적인 Java & Scala의 경우 DataSet을 사용한다.
- SparkSQL은 구조화된 데이터를 SQL로 처리한다.
- 데이터프레임은 테이블처럼 SQL로 처리 가능하다.
- SparkML 등 다양한 라이브러리도 제공된다.
Spark 활용 예시
-
- logfile → s3 → spark(hive, presto(AWS에서는 Athena), hive 등등) → redshift
-
- ML 모델에 사용되는 대용량 피처 처리
Spark 구조
- Driver: 코드가 실행되는 마스터 역할 → 다수의 Executor: 실제 task를 실행해주는 역할을 수행 (Executor별로 CPU 수와 메모리를 할당한다)
Spark 시스템 아키텍처
- 대용량 스토리지에 저장된 데이터를 Spark 클러스터로 올려서 → 처리 → 외부 데이터에서 사용하는 형태
- 데이터가 병렬처리 가능하려면 데이터가 나눠져 있어야 한다.
- 데이터를 block 단위로 쪼개서 병렬처리함으로써 처리속도를 높인다.
- 처리할 수 있는 데이터의 크기 또한 커지게 된다.
- 개발자의 개입 없이 발생하는 여러 문제들을 핸들링 가능하다.
셔플링
- group by와 같이 key의 값을 중심으로 한데로 모여야 하는 케이스의 경우에는 key값을 가지는 block이 어떤 식으로 분산되어 있는지에 따라 처리속도가 크게 달라진다.
- 따라서 group by, sort 등 새로운 block이 만들어져야 하는 경우에 발생한다.
- 네트워크를 타고 데이터가 이동하는데, 이때 시간이 많이 걸리며, 셔플링이 수행되는 경우 데이터가 편향되어 한쪽에 몰리게 되면
Data Skewness가 발생한다. 이를 잘 해결하는 것이 결국 핵심이다.
Spark 프로그래밍 흐름
- Spark 세션(Spark cluster와 통신하는 객체) 생성
- 입력 데이터를 Spark Cluster로 로딩
- 데이터 조작 작업을 진행(판다스와 아주 흡사하다)
- 최종 결과를 저장한다.
실습: https://colab.research.google.com/drive/1raGD7ABNOpAcefIox_BvG390tRZJrUz3
정리하며
Airflow 강의 7강에서는 CTAS의 한계와 Google Sheet 연동, DAG 간 의존성 패턴(Explicit/Reactive trigger)을 다뤘다. 이어서 Spark의 주요 개념인 RDD, DataFrame, SparkSQL, 시스템 아키텍처, 셔플링 등을 개략적으로 살펴보았다. 특히 데이터 편향(Data Skewness) 문제를 적절히 다루는 것이 분산 처리 성능 최적화의 핵심임을 알 수 있었다.