Spark 전체 계층 구조
계층 개요
┌─────────────────────────────────────────────────┐
│ User API 계층 │
│ Spark SQL · DataFrame · Dataset · RDD API │
├─────────────────────────────────────────────────┤
│ Catalyst Optimizer │
│ 논리/물리 계획 최적화 → "무엇을 실행할지" │
├─────────────────────────────────────────────────┤
│ Tungsten Execution Engine │
│ 물리 실행 최적화 → "얼마나 빠르게 실행할지" │
├─────────────────────────────────────────────────┤
│ RDD & BlockManager │
│ 실제 데이터 → "어디서 읽고 어디에 저장할지" │
├─────────────────────────────────────────────────┤
│ Storage (HDFS / S3 / Local FS) │
└─────────────────────────────────────────────────┘
Catalyst Optimizer
논리적 실행 계획을 수립하고 최적화하는 두뇌 역할
| 단계 | 이름 | 역할 |
|---|
| ① | Analysis | 스키마·컬럼 검증, Unresolved → Resolved 변환 |
| ② | Logical Optimization | 규칙 기반 최적화 (Predicate Pushdown, Constant Folding 등) |
| ③ | Physical Planning | 실행 전략 선택 (BroadcastJoin vs SortMergeJoin 등) |
| ④ | Code Generation | 물리 계획을 JVM 바이트코드로 변환 → Tungsten으로 전달 |
Tungsten Execution Engine
물리 계획을 실제로 고속 실행하는 엔진 역할
| 구성 요소 | 설명 |
|---|
| UnsafeRow | Row 데이터를 네이티브 byte 배열(Off-Heap)에 저장 |
| Off-Heap Memory Manager | JVM 외부 메모리 직접 관리 → GC 영향 없음 |
| WholeStage Codegen | Physical Plan을 Java 소스 코드로 자동 생성 후 JIT 컴파일 |
| Vectorized Execution | Parquet / ORC 컬럼 단위 연산으로 CPU 캐시 효율 향상 |
Catalyst가 생성한 Physical Plan 예시
*(2) HashAggregate(keys=[city#18], functions=[avg(salary#21)])
+- *(2) Filter (age#20 > 30)
+- *(2) FileScan json [age#20, city#18, salary#21] ...
Tungsten이 생성한 Java 코드 예시
while (input.hasNext()) {
UnsafeRow row = (UnsafeRow) input.next();
int age = row.getInt(1);
if (age > 30) {
double salary = row.getDouble(2);
avgAgg.update(salary);
}
}
RDD & BlockManager
실제 데이터를 읽고 저장하는 창고 역할
| 구성 요소 | 위치 | 역할 |
|---|
| HadoopRDD / FileScanRDD | Driver | 입력 소스 추상화, Partition 매핑 |
| BlockManagerMaster | Driver | 블록 위치·메타데이터 "주소록" 관리 |
| BlockManager | Executor | 실제 데이터 메모리(Heap/Off-Heap) 또는 디스크 저장 |
전체 실행 흐름 예제
val df = spark.read.json("hdfs://data/people.json")
.filter($"age" > 30)
.groupBy("city")
.agg(avg("salary"))
.cache()
df.count()
| 단계 | 담당 | 처리 내용 |
|---|
| ① | Catalyst | SQL 파싱 및 Logical Plan 생성 |
| ② | Catalyst | Predicate Pushdown, Column Pruning 등 최적화 |
| ③ | Catalyst | Physical Plan 생성 (FileScan → Filter → Aggregate) |
| ④ | Tungsten | WholeStage Codegen으로 Java 바이트코드 생성 |
| ⑤ | RDD 계층 | FileScanRDD 생성, InputSplit → Partition 매핑 |
| ⑥ | Executor | Task 실행, 파일 읽기, UnsafeRow 변환 |
| ⑦ | Executor | BlockManager에 데이터 저장 (cache) |
| ⑧ | Driver | BlockManagerMaster에 블록 위치 등록 |
| ⑨ | Action (count) | Driver가 위치 조회 → Executor에서 직접 계산 |
한 줄 요약
| 컴포넌트 | 비유 | 역할 |
|---|
| Catalyst | 두뇌 | 무엇을 실행할지 |
| Tungsten | 고속 실행 엔진 | 얼마나 빠르게 실행할지 |
| BlockManager (Executor) | 창고 | 데이터를 실제로 저장 |
| BlockManagerMaster (Driver) | 지도 | 데이터가 어디 있는지 추적 |
* 추후 텅스텐 엔진관련한 부분도 상세히 정리해보고자 한다...