실시간 빅데이터 처리를 위한 Spark & Flink Online 10) Catalyst Optimizer 및 Tungsten Project 작동원리

Spark Backend

Catalyst와 Tungsten 두 백엔드로 최적화 된다

Two Engines of Spark

  • 스파크는 쿼리를 돌리기 위해 두가지 엔진을 사용한다
    • Catalyst
    • Tungsten

Catalyst 한눈에 알아보기

  • SQL과 DataFrame이 구조가 있는 데이터를 다룰 수 있게 해주는 모듈

Catalyst가 하는 일

  • Logical Plan을 Physical Plan으로 바꾸는 일
    1. 분석: DataFrame 객체의 relation을 계산, 컬럼의 타입과 이름 확인

    2. Logical Plan 최적화

      1. 상수로 표현된 표현식을 Compile Time에 계산 (x runtime)
      2. Predicate Pushdown: join & filter -> filter & join
      3. Projection Pruning: 연산에 필요한 컬럼만 가져오기
    3. Physical Plan 만들기: Spark에서 실행 가능한 Plan으로 변환

    4. 코드 제너레이션: 최적화된 Physical Plan을 Java Bytecode로

Logical Plan이란?

  • 수행해야하는 모든 transformation 단계에 대한 추상화
  • 데이터가 어떻게 변해야 하는지 정의하지만
  • 실제 어디서 어떻게 동작 하는지는 정의하지 않음

Physical Plan이란?

  • Logical Plan이 어떻게 클러스터 위에서 실행될지 정의
  • 실행 전략을 만들고 Cost Model에 따라 최적화

Logical Planning 최적화

SELECT zone_data.Zone, count(*) AS trips\
	FROM trip_data JOIN zone_data \
    ON trip_data.PULocationID = zone_data.LocationID \
    WHERE trip_data.hvfhs_license_num = 'HV0003' \
    Group By zone_data.Zone order by trips desc

Explain

  • spark.sql(query).explain(True)
    • Parsed Logical Plan
    • Analyzed Logical Plan
    • Optimized Logical Plan
    • Physical Plan

Explain SQL 실습

Spark.sql("SELECT zone_data.Zone, count(*) AS trips\
	FROM trip_data JOIN zone_data \
    ON trip_data.PULocationID = zone_data.LocationID \
    WHERE trip_data.hvfhs_license_num = 'HV0003' \
    Group By zone_data.Zone").explain(True)

먼저 Parsed Logical Plan 이 실행 -> 사용자가 쓴 코드를 Logical Plan으로 변환
Zone과 trip 데이터가 join되고
필터되고
어그리게이트되고
정렬되는 순으로 아래서부터 역순으로 진행됨
다음으로 Analyzed Logical Plan이 실행 -> 사용자가 지정한 테이블에 무슨 컬럼이 있는지 확인을 함
join을 하고 필터링을 함
다음으로 Optimized Logical Plan이 실행 -> 필터링이 어차피 한 테이블 안에서만 이루어지는 것을 볼 수 가 있으니까 프로그램 자체에서 필터링을 안쪽으로 내림 (predicate pushdown???)
마지막으로 Physical Plan이 실행 -> 훨씬 더 detail한 plan
위 과정에선 그냥 join을 진행하였으나 BrodcastHashJoin을 사용 join의 유형까지 선택하는 단계

predicate push down이란?
대부분의 쿼리 엔진은 필터링을 최대한 소스에 가깝게 적용하고자 한다. 소스에 가깝게 필터를 적용한다는 것의 의미는, 파일시스템에서 데이터를 읽어온 이후에 메모리에서 필터링 하는 것이 아니라, 파일을 읽을 때부터 꼭 필요한 데이터만 효율적으로 읽겠다는 것이다
출처: https://jaemunbro.medium.com/apache-spark-partition-pruning%EA%B3%BC-predicate-pushdown-bd3948dcb1b6

위 과정에서 나온 Physical Plan은 Tungsten으로 넘어가게 된다.

Tungsten

  • Physical Plan이 선택되고 나면 분산 환경에서 실행될 Bytecode가 만들어지게 된다 - 이 프로세스를 Code Generation이라고 부른다
  • 스파크 엔진의 성능 향상이 목적
    • 메모리 관리 최적화
    • 캐시 활용 연산
    • 코드 생성

Summary

  • catalyst Optimizer
  • Explain으로 Execution Plan 확인
  • Tungsten

좋은 웹페이지 즐겨찾기