Apache DataFusion Comet 1.0.0: Spark 물리 계획을 Rust로 실행하는 네이티브 가속기의 GA와 운영 기준
요약
Apache DataFusion Comet은 Apache Spark의 물리 실행 계획을 가로채 Rust와 Arrow 기반의 DataFusion 엔진으로 대체하는 플러그인이다. JVM 오버헤드와 Java 기반 실행을 줄이고, Arrow 열 형식으로 메모리에 데이터를 유지하면서 스캔·필터·집계·조인·셔플 연산을 가속한다.
2026년 8월 7일, 프로젝트가 Apache DataFusion에 기증된 지 2년 만에 버전 1.0.0 GA가 출시됐다. 0.1.0부터 20번의 릴리스를 거쳐, 400개 이상의 Spark 표현식 지원, 4가지 조인 연산자 가속, 완전 네이티브 셔플, ANSI 모드 완전 지원이 이번 GA에서 확인됐다. 코드 변경 없이 기존 Spark 파이프라인에 활성화할 수 있다.
- Apache DataFusion Comet 1.0.0 · 2026년 8월 7일 출시
- Spark 3.4~4.1 지원 (4.2 실험적)
- Apache DataFusion 기증: 2024년 3월
Comet이 필요한 이유
Apache Spark는 JVM 위에서 동작하며, 쿼리 실행의 상당 부분이 Java/Scala 코드로 구현돼 있다. 이 구조는 다음 두 가지 오버헤드를 만든다.
첫째, JVM 실행 오버헤드. GC 일시정지, 객체 직렬화 비용, JIT 컴파일러의 한계가 누적된다. 특히 집계·조인처럼 CPU 집약적인 연산에서 Rust 네이티브 코드 대비 처리 속도 차이가 드러난다.
둘째, 열 형식 변환 비용. Spark은 내부적으로 열 형식(Columnar)과 행 형식(Row)을 오가며, Arrow 열 형식의 이점을 온전히 활용하지 못한다.
Comet은 Spark의 쿼리 계획 레이어는 그대로 두고, 물리 실행 레이어만 Rust DataFusion으로 대체한다.
Comet 1.0.0의 핵심 변경사항
400개 이상의 Spark 표현식 지원
Comet은 Spark의 물리 계획에 등장하는 표현식을 DataFusion 표현식으로 변환한다. 표현식이 Comet에서 지원되지 않으면 해당 연산자는 JVM 경로로 폴백한다. 1.0.0에서는 400개 이상의 표현식이 지원되어 폴백 빈도가 크게 줄었다.
지원하는 연산자 종류:
| 범주 | 포함 항목 |
|---|---|
| 조인 | BroadcastHashJoin, SortMergeJoin, ShuffleHashJoin, BroadcastNestedLoopJoin |
| 집계 | count, sum, avg, min, max, first/last, 다양한 통계 집계 |
| 윈도 함수 | rank, row_number, lead, lag, 집계 윈도 |
| 생성기 | explode, posexplode, inline |
| 기타 | 인메모리 테이블 스캔, 샘플링 |
완전 네이티브 셔플
셔플은 분산 처리에서 가장 비용이 큰 연산 중 하나다. Comet 0.x 시리즈에서도 셔플 가속을 지원했지만, 읽기 측에서 FFI(Foreign Function Interface)를 통해 데이터를 전달하는 구조 때문에 배치 단위 FFI 호출 비용이 누적됐다. 특히 셔플이 많은 쿼리(GroupBy, SortMergeJoin 등)에서 이 오버헤드가 뚜렷했다.
1.0.0에서 셔플 리더가 FFI 없이 동작하도록 재구현됐다. 셔플 데이터가 Arrow IPC 형식으로 디스크에 기록되고, Rust 리더가 직접 이를 읽어 DataFusion 실행 경로에 Arrow 배치로 전달한다.
ANSI 모드 완전 지원
Spark 4.0부터 ANSI SQL 준수 모드가 기본값으로 바뀌었다. ANSI 모드는 오버플로·나눗셈 오류·null 처리 등에서 엄격한 동작을 요구한다. Comet 1.0.0은 ANSI 모드를 완전히 지원하며, Spark 4.0/4.1 워크로드에서 코드 변경 없이 활성화할 수 있다.
Iceberg 통합: iceberg-rust로 Executor 읽기 이전
Iceberg 테이블을 처리할 때 분할 계획(split planning)은 Iceberg Java 라이브러리가 드라이버에서 처리하고, 실제 데이터 읽기는 iceberg-rust가 Executor에서 Rust 네이티브로 실행한다. JVM이 파일 I/O에 개입하는 빈도를 줄이고 Arrow 형식으로 직접 읽어 변환 비용을 줄인다.
테스트 커버리지
Comet은 Spark 자체 테스트 스위트를 Comet 활성 상태로 실행한다. 1.0.0 기준으로 24,000개 이상의 유닛 테스트가 CI에서 지원 Spark 버전별로 전부 실행된다. 이 접근법은 Comet이 Spark 동작을 정확히 재현하는지 지속적으로 검증한다.
활성화와 운영 고려사항
기본 활성화
Comet은 Spark 설정 한 줄로 활성화한다.
spark.comet.enabled=true추가 설정:
# 셔플도 Comet으로 처리 (권장)
spark.comet.exec.shuffle.enabled=true
# Comet이 지원하지 않는 표현식은 JVM으로 폴백 (기본값 true)
spark.comet.exec.all.enabled=false # 폴백 허용 (기본)
spark.comet.exec.all.enabled=true # 모든 연산 Comet 강제 (지원 연산만)폴백 동작 이해
Comet이 지원하지 않는 표현식·연산자를 만나면 해당 단계를 JVM 경로로 폴백한다. 폴백이 잦을수록 Comet의 이점이 줄어든다. 쿼리 실행 계획을 EXPLAIN EXTENDED로 확인하면 어느 노드가 Comet으로 실행되는지 볼 수 있다.
EXPLAIN EXTENDED
SELECT category, SUM(amount)
FROM orders
GROUP BY category;
-- 계획에 "CometExec" 노드가 있으면 Comet 실행 중Spark 버전 호환성
| Spark 버전 | 지원 상태 |
|---|---|
| 3.4.x | 지원 |
| 3.5.x | 지원 |
| 4.0.x | 지원 |
| 4.1.x | 지원 |
| 4.2.x | 실험적 |
| 3.3.x 이하 | 미지원 |
주의: 셔플 결과 순서
Comet 네이티브 셔플은 Spark JVM 셔플과 데이터 파티셔닝은 동일하지만, 파티션 내 행 순서가 다를 수 있다. 순서에 의존하는 쿼리(예: FIRST_VALUE 없이 ORDER BY 누락)는 결과가 달라질 수 있다. ORDER BY를 명시해 결과를 결정적으로 만드는 것이 바람직하다.
운영 체크리스트
활성화 전
□ Spark 버전 확인 (3.4 이상)
□ ANSI 모드 여부 확인 (Spark 4.0+ 기본 활성)
□ 기존 쿼리 결과 샘플 검증용 골든 셋 준비
활성화 후
□ EXPLAIN EXTENDED로 Comet 노드 비율 확인
□ 폴백 빈도 모니터링 (spark.comet.*.fallback 메트릭)
□ 셔플 집약적 쿼리의 결과 순서 검증
□ 메모리 사용량 모니터링 (Arrow 오프힙 메모리 추가)
Iceberg 환경
□ iceberg-rust 의존성 클래스패스 포함 확인
□ Iceberg 테이블 읽기 성능 before/after 측정
□ 스키마 복잡도 높은 테이블에서 표현식 지원 여부 확인언제 Comet이 가장 효과적인가
Comet은 CPU 집약적인 분석 쿼리에서 효과가 크다. 특히 다음 패턴에서 기대 효과가 높다.
- 대규모 GroupBy 집계: 많은 셔플과 집계 연산이 Rust 경로로 실행됨
- 복잡한 조인: 4가지 조인 모두 Comet이 가속
- Iceberg 파케이 스캔: iceberg-rust로 읽기 경로 전체가 Arrow 네이티브
- ANSI 모드 Spark 4.x 환경: 기본값과 일치하므로 추가 설정 불필요
반면, I/O 바운드 쿼리(대용량 파일 스캔이 주된 병목), Python UDF가 많은 쿼리(UDF는 JVM 폴백), 미지원 표현식이 많은 쿼리에서는 효과가 제한적이다.
역사적 맥락: 왜 이 GA가 의미 있는가
DataFusion Comet은 2023년 Apple이 내부 Spark 가속기로 개발했다가 2024년 3월 Apache DataFusion 프로젝트에 기증했다. 이후 23개 이상의 조직에서 120명 이상의 기여자가 참여해 20번의 릴리스를 거쳤다.
1.0.0 GA는 단순한 버전 번호 변경이 아니다. Spark의 표준 테스트 스위트를 통과하고, ANSI 모드를 지원하며, 네이티브 셔플 FFI 문제를 해결하고, Iceberg 통합을 Rust 레이어로 내려보낸 것이 1.0.0의 실질적 내용이다.
이는 기존 Spark 파이프라인을 재작성하지 않고 네이티브 실행 속도를 얻을 수 있는 경로가 생산 준비 단계에 들어섰음을 의미한다.
요점 정리
Apache DataFusion Comet 1.0.0은 세 가지 면에서 주목할 만하다.
첫째, 코드 변경 없이 활성화된다. spark.comet.enabled=true 한 줄로 기존 Spark 파이프라인에 Rust 실행 경로가 적용된다.
둘째, 셔플 FFI 오버헤드를 제거했다. 셔플 집약적 쿼리에서 성능 저하의 주요 원인이 해결됐다.
셋째, Spark 4.x ANSI 모드와 완전히 호환된다. Spark 4.0 이상으로 마이그레이션한 팀은 추가 설정 없이 Comet을 활성화할 수 있다.
미지원 표현식 폴백, Python UDF 한계, 메모리 모니터링(Arrow 오프힙 영역) 세 가지를 운영 환경에서 반드시 확인해야 한다.
References
- Apache DataFusion Blog — "Apache DataFusion Comet 1.0.0 Release" (2026년 8월 7일)
https://datafusion.apache.org/blog/output/2026/08/07/datafusion-comet-1.0.0/
- DataFusion Comet 공식 문서 및 Accelerator for Apache Spark and Iceberg
https://datafusion.apache.org/comet/
- datalakehousehub.com — "DataFusion Comet 1.0 and What Native Rust Scans Change for Spark on Iceberg"
https://datalakehousehub.com/blog/datafusion-comet-1-spark-iceberg/
- Apache DataFusion Comet GitHub Repository
https://apache.googlesource.com/datafusion-comet/
- Apache DataFusion Comet 0.15.0 Release (이전 주요 릴리스)
https://datafusion.apache.org/blog/output/2026/04/18/datafusion-comet-0.15.0/