SPARK 파티션, 액션, 그리고 DAG 구조 이해하기

2025. 2. 25. 00:21SPARK


Spark는 방대한 데이터를 빠르게 처리하기 위한 분산 처리 엔진이며,

데이터프레임(DataFrame)과 RDD(Resilient Distributed Dataset) 등의 자료 구조를 효과적으로 활용할 수 있는 다양한 API를 제공한다


특히 트랜스포메이션(Transformation), 액션(Action), 지연 실행(Lazy Evaluation) 같은 개념을 파악하면 훨씬 효율적으로 Spark를 다룰 수 있다


또한 Spark UI를 통해 작업을 모니터링하고, DAG(지향성 비순환 그래프)를 최적화하는 원리를 파악하면 한층 더 높은 퍼포먼스를 이끌어낼 수 있다


목차

  1. Spark 파티션(Partition)의 이해
  2. 트랜스포메이션(Transformation)과 액션(Action)
  3. 지연 실행(Lazy Evaluation)
  4. DAG와 Catalyst Optimizer
  5. Spark UI로 모니터링하기
  6. 마무리 및 참고 자료

1. Spark 파티션(Partition)의 이해

파티션(Partition)은 큰 데이터셋을 여러 조각으로 나누어 병렬 처리를 용이하게 만드는 논리적 단위이다
Spark는 클러스터 환경에서 각각의 파티션을 동시에 처리하여 빠른 성능을 낸다

1.1 파티션이 구성되는 방식

  • 일반적으로 HDFS 블록 크기(예: 128MB)에 따라 자동으로 나뉘어 파티션이 구성된다
  • repartition(n)이나 coalesce(n)를 통해 파티션 수를 조정할 수 있다
  • 키-값 형태의 연산에서는 partitionBy(컬럼명) 같은 방식으로 특정 컬럼을 기준으로 파티션을 구성하기도 한다

1.2 파티션 최적화의 중요성

  • 너무 적은 파티션: 병렬성을 살리지 못해 일부 노드만 과부하가 걸릴 수 있다
  • 너무 많은 파티션: 스케줄링 오버헤드가 커져 오히려 성능이 떨어질 수 있다
  • 적절한 파티션 수를 유지해 병렬 처리와 오버헤드 사이의 균형을 맞추는 것이 중요하다

2. 트랜스포메이션(Transformation)과 액션(Action)

Spark 연산은 크게 트랜스포메이션액션 두 가지로 나눌 수 있다

2.1 트랜스포메이션(Transformation)

  • 기존 RDD나 DataFrame을 변환해 새로운 RDD나 DataFrame을 정의하는 연산이다
  • 예: map(), filter(), flatMap(), select(), join(), groupBy() 등
  • 실제 연산이 즉시 실행되는 것이 아니라, 내부적으로 실행 계획만 기록되며 지연 실행을 따른다

2.2 액션(Action)

  • 지연되어 있던 트랜스포메이션의 실제 실행을 유발하는 연산이다
  • 예: count(), collect(), show(), take(), write() 등
  • 액션을 호출하는 시점에 Spark가 분산 환경에서 실제 연산을 수행하고, 결과를 반환하거나 저장한다

정리

  • 트랜스포메이션: “연산 설계”
  • 액션: “실제 연산 실행”

 


3. 지연 실행(Lazy Evaluation)

Spark는 지연 실행 방식을 통해 전체 연산 흐름을 한 번에 최적화한다

  1. 트랜스포메이션 호출: 새로운 연산을 정의하되, 즉시 결과를 계산하지 않는다
  2. 액션 호출: 지금까지 쌓인 연산 그래프(DAG)를 종합적으로 분석해 최적화한 뒤 실제 연산을 수행한다
  3. 최종 결과 반환: 모든 트랜스포메이션이 액션 시점에 일괄 실행되어 결과가 나온다

이 방식은 중간 결과를 저장하거나 불필요한 연산을 매번 수행하는 오버헤드를 줄이고, 전체 파이프라인을 최적화할 수 있게 해준다


4. DAG와 Catalyst Optimizer

4.1 DAG(지향성 비순환 그래프)의 형성

Spark는 트랜스포메이션을 호출할 때마다 의존 관계를 DAG로 구성한다

  • 각 노드: RDD 또는 DataFrame
  • 엣지: 트랜스포메이션
  • Shuffle이 필요한 지점(넓은 의존성)에서 스테이지가 분할된다

4.2 Catalyst Optimizer

Spark SQL과 DataFrame, Dataset API는 내부적으로 Catalyst Optimizer라는 최적화 엔진을 사용한다

  • 논리적 계획 분석논리적 최적화물리적 계획 수립코드 생성 순으로 진행한다
  • 필터 푸시다운, 컬럼 프루닝(Column Pruning), 적절한 조인 전략 선택 등을 통해 최적의 실행 계획을 세운다

이 과정을 통해 Spark는 불필요한 연산을 줄이거나 Shuffle를 최소화하면서, 효율적인 자원 활용을 가능하게 만든다


5. Spark UI로 모니터링하기

Spark 애플리케이션이 실행되는 동안, Spark UI에서 Job, 스테이지, 태스크 정보 등을 실시간으로 확인할 수 있다
로컬 모드에서 실행하면 일반적으로 http://localhost:4040으로 접속해 확인할 수 있으며, 클러스터 모드에서도 웹 UI를 지원한다

5.1 주요 탭

  1. Jobs: 액션 단위로 생성된 작업(Job)의 상태와 실행 시간을 확인한다
  2. Stages: Shuffle 경계로 나뉜 스테이지별 태스크 진행 상황을 확인한다
  3. Tasks: 스테이지 내부의 세부 태스크를 모니터링하고, 실패나 성능 저하 원인을 추적한다
  4. Storage: 캐싱된 RDD 혹은 DataFrame의 정보와 메모리 사용량을 확인한다
  5. Environment: 스파크 및 자바, 파이썬, 스칼라 버전 정보와 환경 변수를 보여준다
  6. Executors: 클러스터 내 각 Executor의 CPU, 메모리, 디스크 사용 현황을 확인한다

5.2 Spark UI 활용 팁

  • 파티션 개수 조정: 태스크 수가 지나치게 많거나 적다면 repartition(), coalesce() 등을 통해 조정한다
  • Shuffle 병목 확인: 특정 스테이지에서 Shuffle가 지나치게 오래 걸리는지 모니터링해 데이터 스큐(skew)를 진단한다
  • 메모리 이슈: Executor별 메모리 사용량을 추적해, GC(가비지 컬렉션)가 과도한지 확인한다

6. 마무리 및 참고 자료

Spark는 파티션, 트랜스포메이션, 액션, 지연 실행, DAG 최적화 같은 개념들을 종합적으로 이해함으로써 효율성을 극대화할 수 있다
Spark UI를 통해 병목 지점을 찾아내고, 필요한 경우 파티션 수나 코드를 재구성해 성능을 높일 수 있다

6.1 참고 자료

 

RDD Programming Guide - Spark 3.5.4 Documentation

RDD Programming Guide Overview At a high level, every Spark application consists of a driver program that runs the user’s main function and executes various parallel operations on a cluster. The main abstraction Spark provides is a resilient distributed

spark.apache.org

 

 

Spark SQL and DataFrames - Spark 3.5.4 Documentation

 

spark.apache.org

https://www.databricks.com/kr/blog

 

블로그

Databricks 팀으로부터 제품 업데이트, Apache Spark 모범 사례, 사용 사례 등을 받아보세요.

www.databricks.com