본문 바로가기

Data Engineering/Apache Spark

[Spark] Apache Spark의 Execution Plan에 대해 알아보자 🙋‍♂️

Apache Spark

 빅데이터 처리를 위한 통합 컴퓨팅 엔진이다. 하드 디스크가 아닌 RAM에 데이터를 보관하고 병렬로 처리하는 인메모리 기반 연산이 가능하다. 다양한 언어(파이썬, 자바, 스칼라,R, SQL)를 지원한다. 

 

자세한 내용은 이 글에서 확인

 

💡 Spark의 실행 계획이란?

 Spark에서 SQL 쿼리, 데이터 프레임, 데이터 셋을 최적화해 처리하는 방식을 설명한다.  Spark에서 최적화 프로그램의 이름은 Catalyst이며 아래 과정과 같이 나타낼 수 있다. 

 

사진 출처: blog.knoldus.com

 

 각 과정에서는 논리적 계획과 물리적 계획을 만들며 이는 마스터 노드(Driver)에서 생성한다.

 

 

1) Logical Plan

사용자가 작성한 쿼리를 논리적인 단계로 표현.
 
Unresolved Logical Plan
쿼리 분석 과정에서 Spark는 사용자가 참조한 테이블과 컬럼이 존재하는지, 정확한지 확인하는 단계이다. 데이터가 저장되는 저장소인 Catalog를 사용해 이를 확인한다. 만약 사용자가 존재하지 않는 테이블이나 컬럼을 참조하면 Unresolved Logical Plan으로 남게 된다.
 
  Resolved Logical Plan
 위 문제가 해결되면 (Resolved) Logical Plan이 생성되고 최적화를 위해 Catalyst Optimizer로 전달된다. 아래는 최적화 방식의 예시이다.

*문제 해결 예) 통계 함수 사용시 unresolved alias에 대한 의미론적 분석 후 쿼리 수행

  • Predicate Pushdown: 필요한 데이터만 읽어들이도록 최적화. 예를 들어 parquet 파일이라면, 파일 저장 시 row group 단위로 컬럼 메타데이터(min, max, null count 등)를 저장하기 때문에 이 과정을 통해서 필요한 row group만 읽을 수 있다.  
  • Constant Folding: 상수 표현식을 미리 계산하여 최적화. 예를 들어 쿼리에 WHERE col1 > 10 + 20과 같은 구문이 있다면 이를 미리 WHERE col1 > 30과 같이 계산하여 불필요한 연산을 줄인다.
  • Join Reordering: 다중 조인 연산의 경우 실행 순서를 최적화. 다양한 순서를 시도하고 비용을 계산해 최적화한다.

 

  Optimized Logical Plan
 위 쿼리 최적화 단계를 거치면 Optimized Logical Plan이 생성된다.
 

 

2) Physical Plan

 Logical Plan을 어떻게 실제로 실행할지 선택(예) 알고리즘 선택).

  • FileScan: 파일 포맷(parquet, csv 등)에서 필요한 데이터를 읽어온다. DataFilter, PartitionFilter, PushedFilter를 거친다.
  • Excange: 파티션 재분배 작업 시 클러스터간 물리적인 데이터 이동을 하는 셔플 연산을 수행한다(고비용의 작업). 
  • Aggregate: GroupBy, Distinct, dropDuplicate 등 작업 시 집계 연산을 수행한다. 연산 방식에는 HashAggregate, SortAggregate, ObjectHashAggregate 가 있다.
  • Join: 데이터를 효과적으로 결합하기 위해 SortMergeJoin, BroadcastHashJoin 등을 사용한다.

사진 출처: Databricks

 
*디버깅 시 dataframe.explain() 을 사용해 콘솔에서 LP와 PP를 확인할 수 있다.
 
 

3) Execution 

Physical Plan이 결정되면 이를 기반으로 작업이 수행된다. 클러스터에서 분산 방식으로 실행될 수 있도록 RDD로 변환되고, RDD간의 의존성을 나타내는 DAG(Directed Acyclic Graph)가 생성되어 작업의 단계(Stage)를 나타낸다. 
 


*RDD(Resilient Distributed Dataset): 분산 처리를 위한 스파크의 기본 데이터 구조.  내부에는 단위 데이터를 포함하며 여러 노드에 나누어 저장한다. 정형/비정형 데이터를 모두 저장할 수 있으며, 변환 작업을 거치면 새로운 RDD 객체를 만들기 때문에 불변성을 가진다(복원 가능).
 
 
 


참고자료

 

Databricks

Databricks is the lakehouse company. Thousands of organizations worldwide — including Comcast, Condé Nast, Nationwide and H&M — rely on Databricks’ open and unified platform for data engineering, machine learning and analytics. Databricks is venture

www.youtube.com

 

Understanding Spark's Logical and Physical Plan in layman's term

This blog pertains to Apache SPARK 2.x, where we will find out how Spark SQL works internally in layman’s terms and try to understand what is Logical and Phys

blog.knoldus.com

 

[Apache Spark] Spark SQL의 카탈리스트 옵티마이저

사용하는 데이터 포맷이 parquet이고, SQL만으로 처리할 수 있는 경우 schema에 매핑되는 클래스를 정의할 필요가 없다. Spark SQL에서는 Catalyst Optimizer가 최적화를 대신해준다. DataFrame은 Untyped Data인 Row

velog.io