상위: Spark
요약
Spark 실행 구조는 Driver, Executor, Cluster Manager로 구성됩니다. Driver는 애플리케이션을 제어하고, Executor는 실제 작업을 수행하며, Cluster Manager는 리소스를 관리합니다. Job은 Stage로 나뉘고, Stage는 여러 Task로 분할되어 병렬 실행됩니다.
Spark 실행 구조


Spark 애플리케이션은 다음과 같은 구조로 실행됩니다:
- Driver가 SparkSession을 생성하고 애플리케이션 코드 실행
- Cluster Manager에게 Executor 리소스 요청
- Executor가 각 노드에서 시작됨
- Driver가 작업을 Task 단위로 분할하여 Executor에 전달
- Executor가 Task를 실행하고 결과를 Driver에 반환
Cluster Manager
- 애플리케이션의 리소스 관리 (CPU, 메모리 등)
- Executor 시작 / 중지 / 재시작 제어
- 종류: Standalone, Mesos, YARN, Kubernetes
Cluster Manager 역할
- 클러스터의 전체 리소스 파악
- Driver의 요청에 따라 Executor에 리소스 할당
- 노드 장애 시 재스케줄링
Driver
- 스파크 애플리케이션 실행 전체 감시 및 제어
- 태스크 분할 및 실행기 전달, 결과 수집
- 클러스터 모드와 클라이언트 모드로 실행 가능
- 클러스터 모드: 드라이버가 클러스터 내의 특정 노드에 존재 → Cluster 안에서
- 클라이언트 모드: 드라이버가 클러스터 외부에 존재 → Spark session
→ 1개의 스파크 어플리케이션에는 1개의 드라이버만 존재
Driver 주요 기능
- SparkSession/SparkContext 생성
- DAG 스케줄러를 통한 실행 계획 수립
- Task 스케줄러를 통한 Task 분배
- Executor 상태 모니터링
- 최종 결과 수집 및 반환
Executor
- 스파크 드라이버가 요청한 태스크들을 받아서 실행하고, 그 결과를 드라이버로 반환
- JVM 프로세스
- 각 프로세스는 드라이버가 요청한 태스크들을 여러 태스크 슬롯(스레드)에서 병렬로 실행
Executor 특징
- 애플리케이션 전체 생명주기 동안 실행됨 (Static Allocation)
- 또는 Dynamic Allocation으로 동적 확장/축소 가능
- 각 Executor는 독립된 메모리 공간을 가짐
- Task 간 데이터는 Shuffle을 통해 교환

Spark Session
- Spark Core 기능들과 상호 작용할 수 있는 진입점 제공
- API로 프로그래밍을 할 수 있게 해주는 객체
- spark-shell에서 기본적으로 제공
- 스파크 애플리케이션에서는 사용자가 SparkSession 객체를 생성해 사용해야 함
SparkSession 생성 예제

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("MyApp") \
.master("local[*]") \
.config("spark.executor.memory", "2g") \
.getOrCreate()
SparkSession 주요 기능
- DataFrame/Dataset API 제공
- SQL 쿼리 실행
- 다양한 데이터 소스 읽기/쓰기
- 설정 관리 (SparkConf)
Job
- 스파크 액션 (save(), collect() 등)에 대한 응답으로 생성되는 여러 태스크로 이루어진 병렬 연산
- 1개의 Action = 1개의 Job
- Job은 여러 Stage로 구성됨

Job 실행 흐름
- Action 호출 (예:
df.collect()) - Driver가 DAG 스케줄러를 통해 Job 생성
- Job을 Stage 단위로 분할
- 각 Stage를 Task로 분할하여 Executor에 전달
Stage
- 스파크 각 잡은 스테이지라 불리는 서로 의존성을 가지는 다수의 태스크 모음으로 나뉨
- Shuffle이 발생하는 지점을 기준으로 Stage를 나눔
- Shuffle: RDD의 데이터를 재분배 (재파티셔닝) 하는 과정
groupByKey(),reduceByKey(),join()등에서 key 기준으로 데이터 재배열할 때
Stage 분할 규칙
- Narrow Transformation: Stage 유지
- Wide Transformation: 새로운 Stage 생성
- Stage 수 = Shuffle 발생 횟수 + 1
Stage 종류
- ShuffleMapStage: 중간 결과를 생성하는 Stage (Shuffle 출력)
- ResultStage: 최종 결과를 생성하는 Stage (Action 실행)
Task
- 스파크 각 잡별 실행기로 보내지는 작업 할당의 가장 기본적인 단위
- 개별 task slot에 할당되고, 데이터의 개별 파티션을 가지고 작업
- Task는 Executor의 스레드에서 실행됨
Task 특징
- 1개의 Task = 1개의 Partition 처리
- Task 수 = Partition 수
- Task는 독립적으로 실행되며 실패 시 재시도 가능
Task 실행 예시
만약 RDD가 100개의 파티션으로 구성되어 있고, 10개의 Executor(각 2개 코어)가 있다면:
- 총 Task 수: 100개
- 동시 실행 가능한 Task: 20개 (10 Executor × 2 Core)
- 5번의 Wave로 모든 Task 완료