Spark 전체 계층 구조

김도비·2025년 11월 6일

Spark

목록 보기
6/7

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

물리 계획을 실제로 고속 실행하는 엔진 역할

구성 요소설명
UnsafeRowRow 데이터를 네이티브 byte 배열(Off-Heap)에 저장
Off-Heap Memory ManagerJVM 외부 메모리 직접 관리 → GC 영향 없음
WholeStage CodegenPhysical Plan을 Java 소스 코드로 자동 생성 후 JIT 컴파일
Vectorized ExecutionParquet / 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 / FileScanRDDDriver입력 소스 추상화, Partition 매핑
BlockManagerMasterDriver블록 위치·메타데이터 "주소록" 관리
BlockManagerExecutor실제 데이터 메모리(Heap/Off-Heap) 또는 디스크 저장

전체 실행 흐름 예제

val df = spark.read.json("hdfs://data/people.json")
  .filter($"age" > 30)
  .groupBy("city")
  .agg(avg("salary"))
  .cache()

df.count()
단계담당처리 내용
CatalystSQL 파싱 및 Logical Plan 생성
CatalystPredicate Pushdown, Column Pruning 등 최적화
CatalystPhysical Plan 생성 (FileScan → Filter → Aggregate)
TungstenWholeStage Codegen으로 Java 바이트코드 생성
RDD 계층FileScanRDD 생성, InputSplit → Partition 매핑
ExecutorTask 실행, 파일 읽기, UnsafeRow 변환
ExecutorBlockManager에 데이터 저장 (cache)
DriverBlockManagerMaster에 블록 위치 등록
Action (count)Driver가 위치 조회 → Executor에서 직접 계산

한 줄 요약

컴포넌트비유역할
Catalyst두뇌무엇을 실행할지
Tungsten고속 실행 엔진얼마나 빠르게 실행할지
BlockManager (Executor)창고데이터를 실제로 저장
BlockManagerMaster (Driver)지도데이터가 어디 있는지 추적

* 추후 텅스텐 엔진관련한 부분도 상세히 정리해보고자 한다...

profile
모든 걸 기록하자

0개의 댓글