Substrait
데이터 처리 연산에 대한 크로스 플랫폼 교환 표준
About
- 다양한 데이터베이스, 분석·쿼리 엔진 간에 구조적 데이터 처리 연산(관계 대수, 쿼리 계획 등)을 직렬화해 교환할 수 있도록 설계된 오픈소스 포맷 및 인터페이스
- DuckDB, Spark, DataFusion, Sirius 등 다양한 DB·분산 처리·쿼리 엔진에서 서로 다른 시스템 간 쿼리/실행계획 교환·호환성 확보를 목적으로 채택·도입 중
- SQL, DataFrame, Pandas 등 각기 다른 쿼리 언어나 엔진의 실행계획을 중립적/표준화된 포맷(프로토콜 버퍼, YAML, JSON 등) 으로 표현해 플러그인·서드파티 엔진 통합, 하드웨어 가속기 연동을 단순화함
Substrait란 무엇인가?
- 데이터 분석/처리 시스템의 "쿼리 계획(Logical/Physical Plan)"을 표준 포맷으로 정의한 오픈소스 프로젝트
- SQL, DataFrame, LINQ 등 다양한 언어의 쿼리 구조(예: SELECT-FROM-WHERE, Join, Aggregation, Projection, Filter 등)를 표준 스키마로 직렬화/역직렬화
Substrait의 주요 특징
- 중립적 쿼리 표현: 논리적(논리 연산자)·물리적(실행 연산자) 쿼리 계획 모두 표현 가능
- 프로토콜 버퍼 기반 직렬화(주로 .proto 스키마 활용)로, 다양한 언어 및 시스템에서 효율적 데이터 교환 가능
- 엔진/플러그인 확장성: 새로운 함수, 연산자, 타입도 플러그인 방식으로 확장 가능
- 하드웨어 가속 연동: GPU/FPGA/전용 가속기용 엔진과 쿼리 계획 레벨에서 손쉽게 통합 가능(Sirius, Velox, NVIDIA RAPIDS 등)
- 플랫폼 간 연동: 데이터 레이크, 분산 처리, 로컬 분석 등 다양한 엔진이 동일 쿼리 계획을 받아들여 실행할 수 있음
Substrait가 왜 중요한가?
- 각 엔진이 별도의 커스텀 인터페이스를 만들지 않고 Substrait만 지원하면 생태계 통합이 즉시 가능
- 데이터 엔진·플랫폼 간 "쿼리/분석 실행 계획의 공통 언어" 역할
- DB에서 쿼리 → Substrait 플랜 → GPU/분산 엔진, 별도 가속기 등으로 전달 및 실행
- 쿼리 변환/재작성 필요 없이 "실행 계획 레벨"에서 엔진 간 연결
실사용 예시
- SQL 파서와 실행 엔진 간 쿼리 플랜 교환(Calcite → Arrow, DuckDB → Sirius 등)
- DuckDB: 내부 쿼리 플랜을 Substrait로 내보내기(export), 외부에서 Substrait 쿼리 불러오기(import) 지원
- Sirius: DuckDB에서 생성된 Substrait 쿼리 플랜을 그대로 받아 GPU 상에서 SQL 실행 가능, 쿼리 파싱/수정 불필요
기술적으로 어떤 구조?
- Substrait 플랜은 주로 프로토콜 버퍼(.proto) 기반 정의
- LogicalPlan, PhysicalPlan, Rel, Expression, Function 등으로 구성
- Filter, Join, Aggregate, Project, Sort 등 연산자별 명확한 스키마
결론
- Substrait는 데이터베이스 및 분석 플랫폼 생태계의 "쿼리 실행계획 표준"으로, 엔진 간 상호운용성·하드웨어 가속화·데이터 생태계 확장성의 핵심
- 하드웨어 가속기 연동이나 쿼리 엔진 통합을 단순화하는 기반 표준으로 자리잡고 있으며, 복잡한 쿼리 파싱/변환 없이도 고성능 분석 인프라 구축이 쉬워짐