아파치 스파크 DAG 스케줄러

From CS Wiki

아파치 스파크 DAG 스케줄러(Apache Spark DAG Scheduler)는 스파크에서 연산을 최적화하고 실행 단계를 관리하는 핵심 컴포넌트로, DAG(Directed Acyclic Graph, 방향 비순환 그래프)를 기반으로 작업을 스테이지(Stage)와 태스크(Task)로 나누어 스케줄링한다.

1 개요[edit | edit source]

스파크에서 실행되는 모든 작업(Job)은 DAG로 변환되며, DAG 스케줄러는 이 그래프를 기반으로 실행 단계를 최적화하고 병렬 처리를 관리한다.

  • DAG(Directed Acyclic Graph)란?
    • 방향성이 있고 순환이 없는 그래프 구조.
    • 각 RDD 변환(Transformation)은 DAG의 노드(Node)로 표현됨.
    • 데이터 종속성을 기반으로 실행 순서를 결정.
  • DAG 스케줄러의 역할
    • 연산을 여러 개의 스테이지(Stage)로 분할.
    • 각 스테이지를 병렬 처리할 수 있는 태스크(Task)로 변환.
    • 실행 순서를 최적화하여 성능을 향상.

2 DAG 스케줄러의 동작 과정[edit | edit source]

DAG 스케줄러는 다음과 같은 단계를 거쳐 작업을 실행한다.

  1. 사용자가 액션(Action)을 호출하면 RDD 연산을 DAG로 변환.
  2. DAG를 여러 개의 스테이지(Stage)로 나눔.
  3. 각 스테이지를 태스크(Task)로 변환하고 클러스터의 Executor에 할당.
  4. 각 태스크가 실행된 후, 다음 스테이지가 의존성에 따라 실행됨.

3 DAG 스케줄러의 주요 구성 요소[edit | edit source]

DAG 스케줄러는 다음과 같은 핵심 요소로 구성된다.

  • Job
    • 사용자가 호출한 액션(예: count(), collect())이 트리거됨.
  • Stage
    • DAG 스케줄러가 Job을 독립적인 실행 단위로 나눈 단계.
    • 좁은 종속성(Narrow Dependency)을 가지는 연산은 하나의 스테이지로 병합.
  • Task
    • 스테이지가 개별 태스크로 나뉘어 Executor에서 병렬 실행.
  • Task Set
    • 동일한 스테이지에 속하는 태스크들의 집합.

4 DAG 예제[edit | edit source]

다음과 같은 스파크 RDD 연산이 있을 때 DAG가 생성되는 과정을 살펴보자.

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("DAGSchedulerExample").getOrCreate()
sc = spark.sparkContext

rdd = sc.parallelize([1, 2, 3, 4, 5])  # Stage 1
rdd = rdd.map(lambda x: x * 2)  # Stage 1
rdd = rdd.filter(lambda x: x > 5)  # Stage 1
result = rdd.collect()  # Stage 2 (Action 호출)

print(result)

이 코드에서 DAG는 다음과 같이 구성된다.

  1. Stage 1
    • parallelize() → RDD 생성
    • map() → 변환 적용
    • filter() → 변환 적용
  2. Stage 2
    • collect() 호출 → 모든 데이터를 드라이버로 수집

5 DAG 시각화[edit | edit source]

스파크 UI를 통해 DAG를 확인할 수 있다.

  • Spark UI 실행
  • 직접 DAG 시각화
    • `rdd.toDebugString()`을 사용하여 DAG 구조 출력.
print(rdd.toDebugString())
출력 예시:
(2) PythonRDD[3] at RDD at PythonRDD.scala:53 []
|  MapPartitionsRDD[2] at map at <stdin>:1 []
|  ParallelCollectionRDD[1] at parallelize at <stdin>:1 []

6 DAG 스케줄러 최적화 기법[edit | edit source]

DAG 스케줄러를 활용하여 성능을 최적화할 수 있는 기법은 다음과 같다.

  • 데이터 로컬리티 고려
    • 실행 노드에 가까운 데이터 파티션에서 태스크를 실행.
  • 좁은 종속성(Narrow Dependency) 활용
    • shuffle 연산을 최소화하여 스테이지 수를 줄임.
  • 캐싱(Cache) 및 체크포인트(Checkpoint) 사용
    • 반복적인 연산 시 중간 결과를 저장하여 성능 향상.

7 DAG 스케줄러 vs 태스크 스케줄러[edit | edit source]

DAG 스케줄러는 스파크의 실행 과정에서 태스크 스케줄러(Task Scheduler)와 함께 동작한다.

컴포넌트 역할
DAG 스케줄러 RDD 변환을 DAG로 변환하고 스테이지로 분할.
태스크 스케줄러 DAG 스케줄러가 생성한 태스크를 클러스터 내 Executor에 분배.
클러스터 매니저 스파크 태스크 실행을 위해 자원을 할당 (예: YARN, Mesos, Kubernetes).

8 응용[edit | edit source]

DAG 스케줄러는 스파크의 다양한 데이터 처리 및 분석 작업에서 활용된다.

  • 대규모 데이터 분석
    • DAG를 최적화하여 효율적인 데이터 처리 수행.
  • 머신러닝 모델 학습
    • 반복적인 연산을 최적화하여 학습 속도 향상.
  • 실시간 데이터 스트리밍
    • 스테이지를 효율적으로 분할하여 실시간 처리 성능 향상.

9 같이 보기[edit | edit source]

10 참고 문헌[edit | edit source]

  • Zaharia, Matei, et al. "Spark: Cluster Computing with Working Sets." USENIX, 2010.
  • Chambers, Bill, and Zaharia, Matei. "Spark: The Definitive Guide." O'Reilly Media, 2018.