← 학습 카테고리

Learn

Spark

38개 모듈 · 현재 11번째

Spark 모듈 11/38 spark-learn-11

Structured API 실행 과정: 논리 계획에서 클러스터 실행까지

Spark: The Definitive Guide (Excerpts, Databricks Preview, 2017) — Chapters 2-6 — Bill Chambers & Matei Zaharia Chapter 4: Overview of Structured API Execution - Logical Planning, Physical Planning, Execution 절 (PDF pp.51-53)

이 모듈을 다 읽으면

  • Structured API 쿼리가 사용자 코드에서 클러스터 실행까지 거치는 4단계를 순서대로 설명할 수 있다
  • unresolved logical plan이 resolved logical plan으로 바뀌는 과정에서 catalog와 analyzer의 역할을 설명할 수 있다
  • 물리 계획 수립 시 비용 모델(cost model)이 어떤 역할을 하는지 설명할 수 있다

Structured API 쿼리는 코드 작성, 논리 계획 변환, 물리 계획 변환, 클러스터 실행의 4단계를 거친다. 논리 계획 수립 단계에서는 catalog를 참조하는 analyzer가 컬럼·테이블을 resolve하고 optimizer가 규칙 기반 최적화를 적용한다. 물리 계획 수립 단계에서는 여러 실행 전략을 비용 모델로 비교해 RDD 트랜스포메이션으로 컴파일하며, 실행 시점에는 네이티브 바이트코드 생성을 통한 추가 최적화도 일어난다.

실행 4단계 개요

Structured API 쿼리 하나가 사용자 코드에서 실제 클러스터 실행까지 가는 과정은 크게 네 단계로 정리된다.

1) DataFrame/Dataset/SQL 코드를 작성한다. 2) 작성한 코드가 유효하면 Spark는 이를 논리 계획(Logical Plan)으로 변환한다. 3) Spark는 이 논리 계획을 물리 계획(Physical Plan)으로 변환한다. 4) Spark는 물리 계획을 클러스터에서 실행한다.

사용자 코드는 콘솔에서 직접 실행되든 제출된 잡(job) 형태로 실행되든 모두 Catalyst Optimizer를 거쳐 실행 계획이 정해진 뒤에야 실제로 실행되고, 그 결과가 사용자에게 반환된다.

핵심 포인트

  • 실행은 코드 작성 → 논리 계획 → 물리 계획 → 클러스터 실행의 4단계를 거친다
  • 모든 사용자 코드는 Catalyst Optimizer를 거쳐 실행 계획이 결정된 뒤 실행된다

논리 계획 수립(Logical Planning)

실행의 첫 단계는 사용자 코드를 논리 계획으로 변환하는 것이다. 이 과정에서 Spark는 먼저 코드를 unresolved logical plan으로 바꾼다. "unresolved"라고 부르는 이유는, 사용자 코드 자체는 문법적으로 유효할 수 있어도 그 코드가 참조하는 테이블이나 컬럼이 실제로 존재하는지는 아직 확인되지 않았기 때문이다.

Spark는 모든 테이블과 DataFrame 정보를 담은 저장소인 catalog를 이용해, analyzer 단계에서 컬럼과 테이블을 resolve한다. 만약 요청한 테이블이나 컬럼 이름이 catalog에 존재하지 않으면 analyzer는 그 unresolved logical plan을 거부(reject)할 수 있다. resolve에 성공하면 그 결과는 optimizer로 넘어가는데, optimizer는 predicate pushdown(조건절 하위 전파)이나 selection 등 규칙들의 집합을 적용해 논리 계획을 최적화한다.

핵심 포인트

  • unresolved logical plan은 참조하는 테이블/컬럼의 존재 여부가 아직 확인되지 않은 상태의 계획이다
  • analyzer는 catalog를 참조해 컬럼·테이블을 resolve하며, 존재하지 않으면 계획을 거부할 수 있다
  • optimizer는 predicate pushdown 등 규칙 기반 최적화를 적용해 resolved plan을 optimized logical plan으로 만든다

물리 계획 수립과 실행

최적화된 논리 계획이 만들어지면 물리 계획(흔히 Spark Plan이라 부름) 수립 단계로 넘어간다. 물리 계획은 그 논리 계획이 클러스터에서 실제로 어떻게 실행될지를 구체화하는 단계로, 여러 개의 실행 전략(physical execution strategy)을 생성한 뒤 비용 모델(cost model)로 이들을 비교해 하나를 선택한다. 예를 들어 조인을 어떤 방식으로 수행할지는 대상 테이블의 크기나 파티션 크기 같은 물리적 속성을 근거로 비교해 결정한다.

물리 계획 수립의 결과물은 일련의 RDD와 트랜스포메이션이다. Spark가 종종 "컴파일러"에 비유되는 이유가 여기에 있다 - DataFrame, Dataset, SQL로 작성된 쿼리를 RDD 트랜스포메이션으로 컴파일해 주기 때문이다.

선택된 물리 계획은 최종적으로 RDD(더 저수준의 프로그래밍 인터페이스) 위에서 실행된다. 이 실행 시점에 Spark는 한 번 더 최적화를 수행하는데, 네이티브 Java 바이트코드를 런타임에 생성해 불필요한 태스크나 스테이지를 통째로 제거할 수 있다. 이 모든 과정이 끝나면 최종 결과가 사용자에게 반환된다.

핵심 포인트

  • 물리 계획(Spark Plan)은 여러 실행 전략을 비용 모델로 비교해 최적의 전략을 선택하는 단계다
  • 물리 계획 수립 결과는 RDD와 트랜스포메이션의 나열이며, 이 때문에 Spark를 쿼리 컴파일러라 부르기도 한다
  • 실행 시점에는 네이티브 Java 바이트코드를 생성해 불필요한 태스크·스테이지를 제거하는 런타임 최적화가 추가로 일어난다