스파크 SQL은 쿼리를 돌리기 위해 두가지 엔진을 사용합니다. Catalyst와 Tungsten에 대해서 자세히 알아보겠습니다.
Spark 성능의 핵심은 Catalyst + Tungsten 이 두 개라고 보면 됩니다.
Catalyst
카타리스트는 사용자가 쓴 코드를 실행가능한 계획으로 바꾸는 엔진이다.
쉽게 얘기하면 어떻게 실행할지 똑똑하게 계획하는 두뇌 즉 최적의 길을 찾는 네비게이션
어느연산을 하려면 실행가능방법이 여러가지가있을텐데 가장 최적화된 코드는 텅스텐으로 넘어간다.
텅스탠은 조금더 low level에서 하드웨어의 최대 성능을 뽑을수있도록 도와준다.

- Spark SQL의 질의 옵티마이저로 Logical Plan을 Physical Plan으로 바꾸는 일을 수행합니다.
Logical Plan(논리 계획)
수행해야하는 모든 transformation단계에 대한 추상화
데이터가 어떻게 변해야하는 정의하지만
실제 어디서 어떻게 동작하는지는 정의하지 않음
- 수행해야하는 모든 Transformation 단계에 대한 추상화
- 데이터가 어떻게 변해야 하는지 정의하지만 실제 어디서 어떻게 동작하는지는 정의하지 않음.
Physical Plan(실행 계획)
Logical Plan이 어떻게 클러스터 위에서 실행될지 정의
실행 전략을 만들고 Cost Plan에 따라 최적화
- Logical Plan이 어떻게 클러스터 위에서 실행될지 정의
- 실행 전략을 만들고 Cost Model에 따라 최적화
Logical Plan을 Physical Plan으로 바꾸는 단계를 살펴보면
Catalyst의 실행 순서
1. 분석
- DataFrame 객채의 relation을 계산, 컬럼의 타입과 이름을 확인합니다.
2. Logical Plan 최적화
- 상수로 표현된 표현식을 compile time에 계산 (runtime시 계산하지 않고)
- Predicate Pushdown : join & filter -> filter & Join
- Project Pruning : 연산에 필요한 컬럼만 가져오기
3. Physical Plan 만들기
- 스파크에서 실행 가능한 Plan으로 변환
4. 코드 제너레이션
- 최적화된 Physical Plan을 Java Bytecode로 변환

Explain
- explain을 통해 paln을 조회할수 있다.
spark.sql(query).explain(True)
1. Parsed Logical Plan
2. Analyzed Logical Plan
3. Optimized Logical Plan
4. Physical Plan
Tungsten(실행 엔진)
Tungsten은 Apache Spark 1.4 버전부터 도입된 성능 최적화 프로젝트입니다. Spark 작업의 메모리 관리, 코드 생성 및 물리적 계획 측면을 최적화하여 Spark 실행 엔진의 성능을 향상시키는 데 중점을 둡니다. 기본적으로 Tungsten은 대규모 데이터 처리 작업에서 Spark의 성능을 향상시키고, 효율적인 확장성을 보장하며, 오버헤드를 최소화하기 위해 개발되었습니다.
텅스텐의 주요 구성 요소
텅스텐은 세 가지 주요 특징을 중심으로 구성됩니다.
1.Tungsten 이전의 Spark는 Java의 표준 메모리 관리 모델에 의존했습니다. 이 모델은 힙에 객체를 할당하고 가비지 컬렉터가 메모리를 관리하도록 하는 방식입니다. 일반적인 사용 사례에서는 문제가 없지만, 특히 대규모 데이터 세트를 처리할 때 상당한 오버헤드가 발생합니다. Tungsten은 JVM 힙에서 벗어나 오프힙 메모리를 사용합니다. 오프힙 메모리는 Spark가 직접 할당하는 메모리로, JVM 가비지 컬렉터의 제어에서 벗어나 불필요한 메모리 관리 오버헤드를 줄여줍니다. 오프힙 메모리 사용은 특히 대용량 데이터를 처리할 때 Spark 작업의 효율성을 향상시킵니다.
2. Spark는 DAG (방향 비순환 그래프) 를 사용하여 변환을 실행합니다. DAG 는 데이터에 적용할 일련의 연산을 지정합니다. 이러한 연산은 일반적으로 인터프리터 방식의 바이트코드를 사용하여 실행되므로 성능 병목 현상이 발생합니다. Tungsten은 런타임에 최적화된 바이트코드를 생성 하여 이 문제를 해결합니다 . 즉, Spark는 매번 각 연산을 인터프리터 방식으로 처리하는 대신 , CPU 효율이 높은 저수준 바이트코드 로 컴파일합니다 . 이는 특히 대규모 데이터 세트에 변환을 반복적으로 적용해야 하는 작업에서 실행 시간을 크게 단축합니다.
3.Spark의 Catalyst 옵티마이저는 필터링, 조인, 집계와 같은 쿼리에 대한 물리적 실행 계획을 생성하는 역할을 합니다. Catalyst는 논리적 수준에서 이러한 연산을 최적화하는 데 탁월한 성능을 보여주지만, Tungsten은 물리적 실행 계획 수준에서 추가적인 최적화를 적용하여 한 단계 더 나아갑니다. Tungsten은 데이터 이동 및 메모리 오버헤드를 최소화하여 정렬, 조인, 집계와 같은 연산이 가능한 한 가장 효율적인 방식으로 수행되도록 보장합니다.
빅데이터에서 텅스텐이 중요한 이유
Tungsten에서 도입된 개선 사항은 Spark의 성능에 상당한 영향을 미쳤습니다. 빅데이터 처리 작업에서는 데이터 세트의 크기가 수 테라바이트 또는 페타바이트에 달하는 경우가 많기 때문에 효율성이 매우 중요합니다. 데이터 양이 증가함에 따라 리소스 소비를 최소화하면서 데이터를 신속하게 처리하는 능력이 점점 더 중요해집니다.
- 실행 속도 향상 : Tungsten은 오프힙 메모리를 사용하고 JVM 가비지 컬렉션 필요성을 줄임으로써 CPU 사이클 과 메모리 오버헤드를 모두 줄여 대규모 데이터 세트를 더 빠르게 처리할 수 있도록 합니다.
- 향상된 리소스 활용률 : Tungsten은 최적화된 메모리 관리를 통해 Spark 작업이 더 적은 메모리를 사용하고 더 적은 하드웨어로 더 큰 데이터 세트를 처리할 수 있도록 보장하여 궁극적으로 인프라 비용을 절감합니다.
- 확장성 향상 : Spark with Tungsten은 실행 속도를 향상시키고 리소스 소비를 줄임으로써 더 큰 데이터 세트를 처리할 수 있으므로 방대한 양의 데이터를 다루는 기업에 더욱 뛰어난 확장성을 제공합니다.
'Spark' 카테고리의 다른 글
| [Spark] - 정규식을 통한 문자열 처리 (0) | 2026.03.23 |
|---|---|
| [Spark] - Spark 기본 동작 (0) | 2026.03.23 |
| [Spark] - Spark 소개 및 분산스파크 구조 (0) | 2026.03.22 |
| [Spark] - applyInPandas(머신러닝&정규화) (0) | 2026.03.22 |
| [Spark] - Window part(rank,row_number,accumulation,rowsBetween) (0) | 2026.03.22 |