Apache Spark 실행 구조 정리(내부 구조 기반)

hoho·2025년 6월 19일

Spark의 "아키텍처"를 기반으로, Spark 애플리케이션이 실행되는 전체 흐름과 내부 구조를 Driver - Cluster Manager - Executor 관점에서 실제 동작 순서와 데이터 흐름, 그리고 관련 용어들을 정리 (Spark 3.x 기준)

주요 구성 요소와 역할

구성 요소설명
Driver사용자가 작성한 코드가 실행되는 컨트롤 노드. 전체 실행 계획 수립, Task 분배 담당
Cluster Manager리소스(CPU, Memory 등)를 할당하고 Executor를 클러스터에 배치함. (ex: YARN, Kubernetes)
Executor실제 Task를 수행하는 프로세스. 클러스터의 각 노드에 위치하며, 데이터 연산 수행
Catalyst OptimizerDriver 내부의 쿼리 최적화 엔진. Logical Plan → Optimized Logical Plan → Physical Plan 생성
Tungsten EngineExecutor 내부에서 Physical Plan을 빠르게 실행하기 위한 메모리/CPU 최적화 엔진

Spark 실행 흐름: 코드에서 실행까지의 단계별 내부 동작

예시 코드:

spark = SparkSession.builder.getOrCreate()
df = spark.read.csv("users.csv")
df2 = df.filter("age > 20")
df2.show()

📍 1단계: Driver 시작 및 세션 생성

  • SparkSession.builder.getOrCreate() 호출 시:

    • Driver JVM 프로세스 시작
    • SparkContext 생성됨 → 클러스터 매니저에 연결 (Standalone, YARN 등)
    • 사용자 설정 정보 로딩

📍 2단계: DataFrame 생성 → Logical Plan 구축

  • spark.read.csv() 호출 시:

    • Catalyst가 Logical Plan을 생성: 데이터 소스, 경로, 스키마 등 포함
    • 이 시점까지는 아직 데이터 읽지 않음 (Lazy Evaluation)

📍 3단계: Transformation 수행 (계획만 추가)

  • df.filter("age > 20") 호출 시:

    • Catalyst는 이전 Logical Plan 위에 Filter 연산 노드를 추가한 새 Logical Plan 구성
    • 여전히 데이터 읽지 않음. 모든 Transformation은 DAG 노드로 누적됨

📍 4단계: Action 호출 → 실행 시작

  • df2.show() 같은 Action 실행 시:

    • Catalyst가 DAG 기반으로 Optimized Logical Plan 생성
    • Catalyst가 이를 Physical Plan으로 변환 (연산 순서, 연산자 배치 결정)
    • Physical Plan을 바탕으로 Stage 분할, 각 Stage를 여러 개의 Task로 나눔

📍 5단계: Cluster Manager를 통한 Executor 할당

  • Driver는 Cluster Manager에 Executor 실행 요청
  • 클러스터 각 노드에 Executor JVM이 기동됨
  • Executor는 Task 실행 준비 상태가 됨

📍 6단계: Task 분배 및 실행

  • Driver는 Physical Plan 기반으로 만들어진 Task들을 Executor에 분배

  • 각 Task는 하나의 데이터 파티션에 해당

  • Executor는 다음을 수행:

    1. 입력 데이터 읽기 (예: CSV 파일의 일부)
    2. 연산 수행 (Filter, Map, Join 등)
    3. 중간 결과를 셔플하거나 Driver로 반환 (Action 유형에 따라)

📍 7단계: 결과 수집 및 출력

  • .show()의 경우: Executor는 결과를 Driver로 전송
  • Driver는 결과를 콘솔에 출력

Spark 핵심 용어 정리 (실행 흐름 기반)

용어설명
TransformationLazy 연산. ex: filter(), map(), select() 등. DAG에 연산 노드로만 저장됨
Action연산을 실행. ex: count(), show(), collect() 등. DAG 실행 트리거
DAG (Directed Acyclic Graph)Transformation들이 쌓인 연산 그래프. Driver의 Catalyst 내부에서 유지됨
Logical Plan사용자의 연산 순서를 추상적으로 표현한 계획. Catalyst가 생성
Optimized Logical PlanCatalyst가 규칙 기반 최적화를 수행한 계획
Physical Plan실제 실행 단계를 포함하는 저수준 계획. 연산 순서/방식 포함
Stage하나 이상의 Task로 구성된 실행 단위. 셔플 전/후로 나뉘어 생성됨
Task데이터 파티션 단위의 최소 실행 단위. Executor에서 병렬 수행됨
Shuffle데이터를 Stage 간 재분배. Join, GroupBy 등 Wide 연산에서 발생함
Broadcast Join작은 테이블을 모든 Executor에 복제하여 셔플을 줄이는 기법
CatalystSpark의 쿼리 최적화 엔진. Plan을 생성하고 변환함
Tungsten실행 시 성능 최적화를 위한 엔진. 메모리/CPU 최적화, 코드 생성 포함
RDDSpark의 저수준 분산 데이터 구조. DataFrame은 RDD 위에 구성됨
PartitionTask가 처리하는 데이터 단위. 하나의 파일 조각 또는 레코드 블록

전체 프로세스 요약 그림

사용자 코드 (PySpark)
    ↓
SparkSession → SparkContext (Driver 생성)
    ↓
Transformation → Logical Plan (Catalyst)
    ↓
Action 호출
    ↓
Optimized Logical Plan → Physical Plan → DAG
    ↓
Stage 나누기 → Task 생성
    ↓
Cluster Manager 통해 Executor 시작
    ↓
Task 분배 및 병렬 실행
    ↓
Executor가 연산 수행 → 결과 Driver로 반환
    ↓
사용자에게 결과 출력

참고

0개의 댓글