Skip to main content

Photon이란?

Photon 은 Databricks가 개발한 C++ 기반 벡터화(Vectorized) 실행 엔진 입니다. 기존 Apache Spark의 JVM(Java Virtual Machine) 기반 실행 엔진을 대체하여, SQL 및 DataFrame 워크로드의 성능을 2배에서 최대 8배까지 향상 시킵니다.
💡 핵심 아이디어: Spark의 기존 엔진은 Java/Scala로 구현되어 JVM의 오버헤드(GC, 메모리 관리)가 있었습니다. Photon은 C++로 작성되어 JVM 없이 네이티브 코드 수준 의 성능을 제공합니다.

기존 Spark SQL 엔진과의 차이

아키텍처 비교

비교 항목Spark SQL 엔진 (기존)Photon 엔진
구현 언어Java/Scala (JVM 위에서 실행)C++ (네이티브 실행)
데이터 처리 방식행 단위(Row-at-a-time) + Whole-Stage CodeGen벡터화(Vectorized, 배치 단위)
메모리 관리JVM Garbage Collector직접 메모리 관리 (off-heap)
CPU 활용JIT 컴파일SIMD 명령어 활용
호환성모든 Spark 연산 지원지원 범위가 점진적으로 확장 중

성능 이점

성능 영역설명
SIMD(Single Instruction, Multiple Data)하나의 CPU 명령으로 여러 데이터를 동시에 처리합니다. 벡터 연산이 수십 배 빨라집니다
메모리 관리JVM GC(Garbage Collection) 없이 직접 메모리를 관리하므로, GC 일시 정지가 발생하지 않습니다
캐시 효율CPU 캐시에 최적화된 데이터 레이아웃으로, 캐시 미스를 줄입니다
네이티브 실행C++ 네이티브 코드로 JVM 오버헤드(바이트코드 해석, JIT 워밍업)가 없습니다
💡 SIMD란? CPU의 벡터 레지스터를 활용하여, 하나의 명령어로 여러 데이터 항목에 동시에 같은 연산을 수행하는 기술입니다. 예를 들어 4개의 정수 덧셈을 한 번에 처리할 수 있습니다.

성능 벤치마크

Databricks의 공식 벤치마크에 따르면, Photon은 다양한 워크로드에서 다음과 같은 성능 향상을 보여줍니다.
워크로드 유형성능 향상 (배수)설명
TPC-DS약 2~3배표준 데이터 웨어하우스 벤치마크
집계 (GROUP BY)약 3~5배SUM, COUNT, AVG 등의 집계 연산
조인 (JOIN)약 2~4배해시 조인, 소트 머지 조인
필터링 (WHERE)약 2~3배조건부 필터링
문자열 처리약 3~8배LIKE, SUBSTR, CONCAT 등
파일 쓰기약 2~3배Parquet/Delta 파일 쓰기

활성화 방법

All-Purpose Cluster에서 활성화

클러스터 생성 시 Photon 가속 을 체크하거나, Runtime 이름에 photon이 포함된 버전을 선택합니다.
Runtime: 15.4.x-photon-scala2.12

Job Cluster에서 활성화

# Asset Bundles YAML 설정
new_cluster:
  spark_version: "15.4.x-photon-scala2.12"
  runtime_engine: "PHOTON"
  num_workers: 4
  node_type_id: "m5.2xlarge"

SQL Warehouse

SQL Warehouse는 기본적으로 Photon이 활성화 되어 있습니다. 별도 설정이 필요 없습니다.

SDP 파이프라인에서 활성화

{
    "name": "my-pipeline",
    "photon": true,
    "clusters": [
        {
            "label": "default",
            "num_workers": 4
        }
    ]
}

지원되는 연산

Photon은 대부분의 SQL 및 DataFrame 연산을 지원하며, 지원 범위가 지속적으로 확장되고 있습니다.

지원되는 주요 연산

카테고리지원 연산
스캔Delta Lake, Parquet 파일 읽기
필터WHERE, HAVING 조건 필터링
집계GROUP BY, SUM, COUNT, AVG, MIN, MAX, DISTINCT
조인INNER, LEFT, RIGHT, FULL OUTER, CROSS, SEMI, ANTI JOIN
정렬ORDER BY, SORT
윈도우 함수ROW_NUMBER, RANK, LAG, LEAD, SUM OVER 등
문자열LIKE, SUBSTR, CONCAT, UPPER, LOWER, TRIM 등
날짜/시간DATE_TRUNC, DATE_ADD, DATEDIFF 등
쓰기Delta Lake INSERT, MERGE, UPDATE, DELETE
파일 쓰기Parquet, Delta 형식 쓰기

Photon으로 실행되지 않는 연산

Photon이 지원하지 않는 연산은 자동으로 기존 Spark 엔진으로 폴백(fallback) 됩니다. 사용자는 이를 인지할 필요 없이, 쿼리가 정상적으로 실행됩니다.
카테고리비지원 연산
UDFPython UDF, Scala UDF (Pandas UDF는 일부 지원)
스트리밍일부 스트리밍 연산
비 Delta 포맷CSV, JSON, ORC 읽기 (Delta/Parquet만 가속)
💡 Photon fallback: 쿼리의 일부만 Photon으로 실행되고 나머지는 Spark 엔진으로 실행되는 혼합 실행도 가능합니다. Spark UI의 Photon 실행 비율 에서 확인할 수 있습니다.

비용 고려사항

Photon DBU 단가

Photon을 사용하면 DBU(Databricks Unit) 소비 단가가 달라집니다.
컴퓨트 유형일반 DBU 단가Photon DBU 단가비고
All-Purpose기본약 1.5~2배개발/탐색용
Jobs기본약 1.5~2배배치 Job용
SQL WarehousePhoton 기본 포함기본 요금에 포함추가 비용 없음

비용 대비 효과 판단

성능 향상 배수 > DBU 단가 증가 배수 → Photon이 비용 효율적
시나리오성능 향상DBU 단가 증가총 비용 효과
집계 중심 SQL3~5배 빠름1.5배비용 절감 (실행 시간이 크게 줄어 총 DBU 감소)
단순 파일 복사1.2배 빠름1.5배비용 증가 (Photon 효과가 적음)
문자열 처리3~8배 빠름1.5배비용 절감

Photon 사용 권장 워크로드

권장비권장
SQL 집계, 조인이 많은 쿼리Python UDF가 많은 워크로드
Delta Lake 읽기/쓰기CSV/JSON 직접 처리
DBSQL (SQL Warehouse) 워크로드스트리밍 위주의 가벼운 처리
ETL 파이프라인ML 학습 (GPU가 더 효과적)

Photon 성능 확인

Spark UI에서 Photon 비율 확인

클러스터의 Spark UI → SQL/DataFrame 탭에서 각 쿼리의 Photon 실행 비율 을 확인할 수 있습니다. 비율이 높을수록 Photon의 이점을 더 많이 활용하고 있다는 의미입니다.

쿼리 성능 비교

-- Photon 활성화 상태에서 실행 시간 측정
SELECT
    region,
    product_category,
    COUNT(*) AS order_count,
    SUM(amount) AS total_revenue,
    AVG(amount) AS avg_order_value
FROM catalog.schema.large_orders_table  -- 수억 행 테이블
GROUP BY region, product_category
ORDER BY total_revenue DESC;

Photon 내부 아키텍처 심화

Photon의 성능 이점을 정확히 이해하려면, 내부 동작 원리를 더 깊이 알아야 합니다.

Vectorized Execution (벡터화 실행) 상세

기존 Spark의 Whole-Stage CodeGen은 행(row) 단위로 파이프라인을 생성합니다. 반면 Photon은 열(column) 단위 배치 로 처리합니다.
항목Spark Whole-Stage CodeGenPhoton Vectorized
처리 단위1행씩 연산자를 거침1,024~4,096행을 한 번에 처리
데이터 레이아웃Row-oriented (Tungsten)Column-oriented (Arrow 호환)
분기 예측행마다 조건 분기배치 전체에 동일 연산 적용(분기 최소화)
CPU 파이프라인 활용분기 미스로 파이프라인 스톨 빈번분기 없는 벡터 연산으로 파이프라인 효율 극대화

SIMD 활용 상세

Photon은 CPU의 AVX2/AVX-512 명령어 세트를 적극 활용합니다.
# SIMD 없이 (스칼라 연산): 4개 값 덧셈 → 4번 연산
a[0] + b[0] → c[0]
a[1] + b[1] → c[1]
a[2] + b[2] → c[2]
a[3] + b[3] → c[3]

# AVX2 SIMD: 4개 값 덧셈 → 1번 연산 (256-bit 레지스터)
VADDPD ymm0, ymm1, ymm2    # 4개의 64-bit double을 한 번에 덧셈

# AVX-512 SIMD: 8개 값 덧셈 → 1번 연산 (512-bit 레지스터)
VADDPD zmm0, zmm1, zmm2    # 8개의 64-bit double을 한 번에 덧셈
SIMD 세대레지스터 폭동시 처리 (64-bit)주요 인스턴스
SSE128-bit2개구형 인스턴스
AVX2256-bit4개m5, r5 시리즈
AVX-512512-bit8개m5n, r5n, i3en 시리즈
💡 인스턴스 선택 팁: AVX-512를 지원하는 인스턴스(예: Intel Ice Lake 이상)에서 Photon의 성능 이점이 가장 극대화됩니다. AWS의 경우 m6i, r6i, i4i 시리즈가 해당됩니다.

Columnar Processing 내부 동작

Photon은 Delta Lake의 Parquet 파일을 읽을 때, 컬럼 단위로 메모리에 적재 합니다.
# 기존 Spark: Row 기반으로 디코딩 후 처리
Parquet Column → Decode → Row 변환 → Row 단위 처리

# Photon: Column 그대로 메모리에 적재하여 벡터 연산
Parquet Column → Direct Column Buffer → SIMD 벡터 연산
이 방식의 장점:
  • CPU 캐시 라인 활용률 극대화: 같은 컬럼의 연속된 값이 메모리에 인접하므로, L1/L2 캐시 히트율이 높아집니다
  • 데이터 압축 활용: 컬럼 단위 인코딩(Dictionary, RLE 등)을 디코딩 없이 직접 연산할 수 있는 경우가 있습니다
  • 불필요한 컬럼 스킵: 쿼리에 필요한 컬럼만 읽으므로 I/O가 줄어듭니다

지원/미지원 연산 상세

Photon에서 특히 빠른 연산

워크로드 유형왜 빠른가성능 향상
Full Table ScanSIMD로 대량 데이터를 한꺼번에 필터링합니다3~5x
GROUP BY 집계벡터화 해시 테이블로 배치 단위 집계합니다3~5x
Hash Join벡터화 해시 프로브로 조인 성능이 향상됩니다2~4x
문자열 처리C++ 네이티브 문자열 라이브러리 사용. JVM String 오버헤드 없음3~8x
Delta MERGEScan + Join + Write가 모두 Photon으로 가속됩니다2~4x
Parquet/Delta 쓰기벡터화 인코딩 + 네이티브 I/O2~3x
Window 함수파티션 내 정렬과 연산이 벡터화됩니다2~3x

Photon이 느린 또는 효과 없는 경우

워크로드 유형이유대안
Python UDFUDF는 JVM/Python 인터프리터에서 실행되므로 Photon 우회Pandas UDF(Arrow 기반)로 전환하거나 SQL 내장 함수 사용
Scala/Java UDFUDF 코드가 JVM에서 실행됩니다SQL 내장 함수로 대체
CSV/JSON 직접 읽기Photon은 Parquet/Delta만 가속합니다Auto Loader로 Delta로 먼저 변환
소량 데이터 처리벡터화 초기화 오버헤드가 데이터 처리 시간보다 클 수 있습니다데이터가 수 MB 이하면 Photon 효과 미미
ML 학습 (MLlib)ML 알고리즘은 별도의 실행 경로를 사용합니다GPU 클러스터가 더 효과적
스트리밍 마이크로배치배치 크기가 작으면 벡터화 이점이 줄어듭니다마이크로배치 간격을 충분히 크게(10초+) 설정

Photon 실행 비율 확인 및 개선

Spark UI에서 Photon 비율이 낮다면 다음을 점검하세요.
점검 항목확인 방법개선 방법
UDF 사용 여부Spark Plan에서 PythonUDF 노드 확인SQL 내장 함수로 대체
파일 포맷소스가 CSV/JSON인지 확인Delta로 변환 후 읽기
복잡한 타입Map, Array, Struct 컬럼 연산단순 타입으로 평탄화(flatten)
Spark 버전구버전 Runtime 사용최신 Runtime으로 업그레이드(매 버전 Photon 커버리지 확대)

DBU 단가 차이와 ROI 계산

정확한 비용 비교 프레임워크

Photon의 비용 효율성을 판단하려면 총 비용(TCO) 을 비교해야 합니다.
# 총 비용 공식
총 비용 = 실행 시간 x (인스턴스 비용/hr + DBU 수 x DBU 단가/hr)

# Photon ROI 공식
ROI = (Photon 없이 총 비용 - Photon 총 비용) / Photon 없이 총 비용 x 100%

워크로드별 ROI 시뮬레이션

시나리오클러스터Spark 실행시간Photon 실행시간Spark 비용Photon 비용ROI
일일 ETL (집계 중심)4 Workers, r5.2xlarge2시간40분$48$28+42%
DBSQL 대시보드 쿼리SQL Warehouse (Medium)30초/쿼리10초/쿼리기본 요금기본 요금추가 비용 없음
문자열 ETL (LIKE, REGEX)8 Workers, m5.xlarge3시간30분$72$21+71%
Python UDF 파이프라인4 Workers, m5.xlarge1시간55분$24$24-8%(DBU 단가만 증가)
소규모 탐색 쿼리2 Workers, m5.large10초8초$0.04$0.05-20%
💡 ROI 판단 기준: Photon이 실행 시간을 1.5배 이상 단축하는 워크로드에서 비용 이점이 있습니다. UDF가 전체 실행 시간의 50% 이상을 차지하면 Photon 효과가 미미합니다.

하이브리드 전략

모든 워크로드에 Photon을 적용하기보다, 워크로드 특성에 따라 선택적으로 적용하는 것이 비용 효율적입니다.
클러스터/파이프라인Photon 권장이유
SQL Warehouse항상 ON (기본)추가 비용 없이 SQL 성능 향상
ETL Job (SQL/DataFrame 중심)ON집계/조인/쓰기 가속으로 ROI 양호
ETL Job (UDF 중심)OFFPhoton 효과 미미, DBU 단가만 상승
SDP 파이프라인ON파이프라인 전체가 SQL 기반이므로 효과 큼
ML Feature EngineeringONSQL 기반 피처 변환에 효과적
ML TrainingOFFGPU가 더 효과적, Photon 효과 없음
Interactive Notebook (탐색)선택적대용량 데이터 탐색 시에만 ON

정리

핵심 개념설명
PhotonC++ 기반 벡터화 실행 엔진으로, SQL/DataFrame 성능을 2~8배 향상시킵니다
벡터화 처리행 단위가 아닌 배치(열) 단위로 데이터를 처리하여 SIMD를 활용합니다
JVM 오버헤드 제거GC 일시 정지가 없고, 메모리를 직접 관리합니다
자동 폴백미지원 연산은 자동으로 기존 Spark 엔진으로 실행됩니다
비용 효과집계/조인 중심 워크로드에서 총 비용이 감소합니다
SIMD 활용AVX2/AVX-512로 한 번의 CPU 명령으로 여러 데이터를 동시 처리합니다
ROI 판단실행 시간 1.5배+ 단축 시 비용 이점. UDF 비중이 높으면 효과 미미합니다
하이브리드 전략SQL 중심 워크로드에만 선택적으로 Photon을 적용하는 것이 최적입니다

참고 링크