2025. 2. 25. 00:21ㆍSPARK
Spark는 방대한 데이터를 빠르게 처리하기 위한 분산 처리 엔진이며,
데이터프레임(DataFrame)과 RDD(Resilient Distributed Dataset) 등의 자료 구조를 효과적으로 활용할 수 있는 다양한 API를 제공한다
특히 트랜스포메이션(Transformation), 액션(Action), 지연 실행(Lazy Evaluation) 같은 개념을 파악하면 훨씬 효율적으로 Spark를 다룰 수 있다
또한 Spark UI를 통해 작업을 모니터링하고, DAG(지향성 비순환 그래프)를 최적화하는 원리를 파악하면 한층 더 높은 퍼포먼스를 이끌어낼 수 있다
목차
- Spark 파티션(Partition)의 이해
- 트랜스포메이션(Transformation)과 액션(Action)
- 지연 실행(Lazy Evaluation)
- DAG와 Catalyst Optimizer
- Spark UI로 모니터링하기
- 마무리 및 참고 자료
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는 지연 실행 방식을 통해 전체 연산 흐름을 한 번에 최적화한다
- 트랜스포메이션 호출: 새로운 연산을 정의하되, 즉시 결과를 계산하지 않는다
- 액션 호출: 지금까지 쌓인 연산 그래프(DAG)를 종합적으로 분석해 최적화한 뒤 실제 연산을 수행한다
- 최종 결과 반환: 모든 트랜스포메이션이 액션 시점에 일괄 실행되어 결과가 나온다
이 방식은 중간 결과를 저장하거나 불필요한 연산을 매번 수행하는 오버헤드를 줄이고, 전체 파이프라인을 최적화할 수 있게 해준다
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 주요 탭
- Jobs: 액션 단위로 생성된 작업(Job)의 상태와 실행 시간을 확인한다
- Stages: Shuffle 경계로 나뉜 스테이지별 태스크 진행 상황을 확인한다
- Tasks: 스테이지 내부의 세부 태스크를 모니터링하고, 실패나 성능 저하 원인을 추적한다
- Storage: 캐싱된 RDD 혹은 DataFrame의 정보와 메모리 사용량을 확인한다
- Environment: 스파크 및 자바, 파이썬, 스칼라 버전 정보와 환경 변수를 보여준다
- Executors: 클러스터 내 각 Executor의 CPU, 메모리, 디스크 사용 현황을 확인한다
5.2 Spark UI 활용 팁
- 파티션 개수 조정: 태스크 수가 지나치게 많거나 적다면 repartition(), coalesce() 등을 통해 조정한다
- Shuffle 병목 확인: 특정 스테이지에서 Shuffle가 지나치게 오래 걸리는지 모니터링해 데이터 스큐(skew)를 진단한다
- 메모리 이슈: Executor별 메모리 사용량을 추적해, GC(가비지 컬렉션)가 과도한지 확인한다
6. 마무리 및 참고 자료
Spark는 파티션, 트랜스포메이션, 액션, 지연 실행, DAG 최적화 같은 개념들을 종합적으로 이해함으로써 효율성을 극대화할 수 있다
Spark UI를 통해 병목 지점을 찾아내고, 필요한 경우 파티션 수나 코드를 재구성해 성능을 높일 수 있다
6.1 참고 자료
- Apache Spark 공식 문서
- Databricks 블로그: Catalyst Optimizer와 Tungsten 엔진, Spark 최적화에 대한 실무 예시가 풍부하다
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
'SPARK' 카테고리의 다른 글
Apache Spark 기본 개념 - 아키텍처부터 간단한 코드 실행까지 (1) | 2025.02.22 |
---|---|
Apache Spark 설치 & 실행기 (0) | 2025.02.22 |