데이터 분석이나 처리 시스템을 설계할 때, 쿼리 언어나 실행 계획이 시스템마다 달라 고민한 적 있으신가요? SQL과 Pandas, Spark와 DuckDB처럼 다양한 쿼리 환경이 각각의 방식으로 동작하는 것은 개발자나 데이터 엔지니어에게 반복 작업과 비효율을 만들어냅니다.
이런 문제를 해결하기 위해 등장한 것이 바로 Substrait입니다. Substrait는 다양한 쿼리 언어와 분석 엔진 간에 쿼리 계획을 표준화된 형식으로 주고받을 수 있도록 만든 오픈소스 프로젝트입니다. 즉, 서로 다른 데이터 시스템 간에도 쿼리를 변환하거나 새로 짤 필요 없이 하나의 공통 언어처럼 데이터를 주고받을 수 있게 해주는 기술입니다.
이 글에서는 Substrait가 무엇인지, 왜 필요한지, 어떤 방식으로 동작하고 실제로 어떻게 쓰이고 있는지까지 차근차근 설명합니다.
Substrait란 무엇인가?
Substrait는 SQL, DataFrame, LINQ 등 다양한 쿼리 언어의 실행 계획을 중립적인 포맷으로 표현할 수 있도록 설계된 오픈소스 표준입니다. 쉽게 말해, 쿼리의 "설계도"를 하나의 통일된 방식으로 저장하고 교환할 수 있게 해주는 기술입니다.
예를 들어 SQL에서 SELECT, JOIN, WHERE, GROUP BY 같은 쿼리 구문이나 Pandas에서의 필터링, 집계 연산 등을 Substrait는 공통된 스키마를 통해 표현합니다. 이 표준화된 계획은 직렬화되어 다양한 시스템 간에 쉽게 공유되고 재활용될 수 있습니다.
왜 Substrait가 필요한가?
데이터 분석과 처리는 단일 시스템이 아닌 다양한 도구와 플랫폼을 넘나드는 복잡한 환경에서 수행됩니다. 예를 들어 로컬에서는 Pandas를 쓰고, 대용량 처리는 Spark에서 실행하고, 일부 연산은 GPU 기반의 엔진에서 처리하고자 할 수 있습니다.
문제는 각 시스템이 서로 다른 방식으로 쿼리를 정의하고 실행한다는 점입니다. 결과적으로 똑같은 데이터를 처리하기 위해 쿼리를 재작성하거나 엔진별로 파서를 개발해야 하는 상황이 반복됩니다.
Substrait는 이런 비효율을 없애고자 만들어졌습니다. 쿼리를 Substrait 포맷으로 한 번만 정의하면, 이후 어떤 엔진에서도 이 쿼리 계획을 해석하고 실행할 수 있습니다. 이는 데이터 플랫폼 간의 실행 계획 수준에서의 상호 운용성을 가능하게 해주며, 새 엔진이나 하드웨어 가속기와의 통합도 쉽게 만들어줍니다.
Substrait의 핵심 특징
1. 중립적 쿼리 표현
Substrait는 논리적 계획(Logical Plan)과 물리적 계획(Physical Plan)을 모두 표현할 수 있습니다. 즉, 연산자가 어떤 작업을 수행해야 하는지뿐만 아니라, 어떤 방식으로 수행할지도 명확히 기술할 수 있습니다.
2. 프로토콜 버퍼 기반 직렬화
쿼리 계획은 주로 .proto 파일을 통해 정의되며, 이는 YAML이나 JSON 등의 형식으로도 변환이 가능합니다. 이로 인해 다양한 언어와 시스템에서 쿼리 계획을 쉽게 읽고 쓸 수 있습니다.
3. 확장 가능한 연산자와 타입
기본적인 연산자 외에도, 새로운 함수나 타입을 플러그인 방식으로 추가할 수 있어 특정 도메인이나 시스템에 맞게 확장 가능합니다.
4. 하드웨어 가속기와의 연동
Substrait는 GPU, FPGA, 전용 가속기 등과의 통합을 용이하게 만들어 줍니다. 예를 들어 NVIDIA RAPIDS 같은 GPU 기반 엔진에서도 Substrait 쿼리 계획을 그대로 받아 실행할 수 있습니다.
5. 텍스트 기반 분석 및 시각화
쿼리 계획은 텍스트 버전으로도 제공되기 때문에, 분석이나 디버깅, 시각화 도구와의 연동도 용이합니다.
Substrait는 실제로 어떻게 사용되는가?
1. DuckDB ↔ Sirius
DuckDB는 내부 쿼리 계획을 Substrait 포맷으로 export하고, 외부에서 import할 수도 있습니다. 이렇게 생성된 Substrait 쿼리 계획은 GPU 기반 엔진인 Sirius에서도 그대로 실행됩니다. DuckDB에서 SQL을 작성하고, 이를 GPU에서 실행하는 과정이 매끄럽게 이어집니다.
2. SQL 파서 ↔ 실행 엔진
Apache Calcite 같은 SQL 파서에서 생성한 쿼리 계획을 Arrow 기반 실행 엔진으로 전달할 수 있습니다. 쿼리를 일일이 번역하거나 파싱하지 않아도 Substrait 포맷으로 주고받으면 바로 실행이 가능합니다.
3. Pandas ↔ 외부 DB 실행
Pandas에서 정의한 DataFrame 연산을 Substrait를 통해 외부 분석 엔진에서 실행할 수 있습니다. 이렇게 하면 로컬 연산 대신 대용량 데이터를 처리하는 외부 시스템을 활용할 수 있게 됩니다.
4. 시각화 도구 연동
서드파티 시각화 도구에서도 Substrait 쿼리 계획을 읽어 들여 직관적인 그래프 형태로 표현할 수 있습니다. 이는 쿼리 최적화나 성능 분석에 특히 유용합니다.
Substrait의 기술 구조
Substrait는 주로 다음과 같은 구성 요소로 이루어져 있습니다.
- LogicalPlan / PhysicalPlan: 전체 쿼리의 논리적·물리적 구조를 표현
- Rel: 각 쿼리 연산(Join, Filter, Aggregate 등)을 의미하는 노드
- Expression: 조건식이나 계산식 표현
- Function: 내장 함수 또는 사용자 정의 함수(UDF)
- Type Catalog: 각 데이터 타입 정의 및 확장 가능 구조
이 구조는 명확한 스키마를 기반으로 직렬화되며, 엔진 간 쿼리 교환을 빠르고 안정적으로 수행할 수 있도록 설계되어 있습니다.
Substrait가 만드는 미래
Substrait는 단순히 쿼리 포맷의 표준 그 이상입니다. 데이터베이스, 분석 엔진, 하드웨어 가속기 등 다양한 시스템을 유기적으로 연결하는 공통 언어로 자리잡아가고 있습니다.
개별 시스템에 맞춰 커스텀 인터페이스를 개발하지 않아도 되며, 새로운 쿼리 엔진이 등장하더라도 쉽게 플러그인처럼 교체하거나 조합할 수 있게 됩니다. 데이터 생태계 전체가 Substrait를 기반으로 상호 연결되고 유연하게 진화할 수 있는 기반이 되는 셈입니다.
앞으로 하드웨어 가속화, 이기종 분산 환경, 새로운 분석 플랫폼의 등장 속에서도 Substrait는 기술적 중심축 역할을 할 가능성이 큽니다. 쿼리 하나로 여러 시스템을 유연하게 넘나들고 싶은 개발자에게 Substrait는 분명 주목할 만한 기술입니다.
Home - Substrait: Cross-Language Serialization for Relational Algebra
Home What is Substrait? Substrait is a format for describing compute operations on structured data. It is designed for interoperability across different languages and systems. How does it work? Substrait provides a well-defined, cross-language specificatio
substrait.io
'빅데이터' 카테고리의 다른 글
Kafka를 HTTP처럼? Go 개발자를 위한 Kafka 활용법, xkafka (0) | 2025.07.14 |
---|---|
GPU로 SQL을 가속한다: 차세대 SQL 엔진 'Sirius'의 모든 것 (0) | 2025.07.03 |
Kafka 메시지를 Iceberg 테이블로 실시간 변환하는 방법: AutoMQ의 Table Topic 혁신 (0) | 2025.06.22 |
Elasticsearch와 ClickHouse를 넘어서는 옵저버빌리티 엔진은? Apache Doris의 압도적 선택지 (0) | 2025.06.20 |
AI 시대, 실시간 동기화의 해답: ElectricSQL로 구축하는 로컬 우선 데이터 인프라 (0) | 2025.06.19 |