dbt·MotherDuck·Ibis 생태계
dbt-duckdb, MotherDuck, Ibis를 DuckDB 기반 분석 운영에 편입하는 기준과 한계를 정리합니다.
핵심 요약
- dbt-duckdb, MotherDuck, Ibis는 무조건 도입할 도구가 아니라 DuckDB 운영 모델을 확장하는 선택지로 다룹니다.
- dbt-duckdb는 warehouse 없이 로컬 .duckdb, :memory:, S3 Parquet source로 모델을 실행하지만 incremental external model 제한 때문에 증분 처리는 별도 설계가 필요합니다.
- MotherDuck은 같은 SQL을 클라우드로 옮기지만 데이터 위치·권한·비용·장애 경계가 local DuckDB와 달라지니 별도 검토를 거쳐 도입합니다.
- Ibis는 Python expression으로 DuckDB SQL을 생성하니 DBA가 검토하는 팀은 expr.compile()로 생성 SQL을 PR/CI artifact에 드러냅니다.
- 도입은 DuckDB SQL 기준 확립 → dbt-duckdb 모델·테스트 → Ibis/Polars 연동 → 협업 필요 시 MotherDuck 순서로 진행합니다.
DuckDB core만으로도 많은 분석을 할 수 있지만, 팀 운영에 들어가면 변환 관리, 협업, 클라우드 공유, Pythonic API가 필요해집니다. 이 장에서는 dbt-duckdb, MotherDuck, Ibis를 "무조건 도입할 도구"가 아니라 DuckDB 운영 모델을 확장하는 선택지로 봅니다.
선택 기준
| 도구 | 쓰기 좋은 경우 | 주의할 점 |
|---|---|---|
| dbt-duckdb | SQL 모델, 테스트, 문서, lineage를 로컬 DuckDB로 관리 | external model과 :memory: 재실행 특성 |
| MotherDuck | DuckDB 분석을 클라우드 공유·협업·BI 연결로 확장 | local-only DuckDB와 비용·권한·데이터 위치가 달라짐 |
| Ibis | Python expression으로 DuckDB SQL을 생성·실행 | SQL 리뷰와 backend portability의 균형 |
dbt-duckdb
dbt-duckdb는 DuckDB adapter입니다. 로컬 DuckDB file, :memory:, S3 Parquet source, external materialization을 활용해 warehouse 없이도 dbt 모델을 실행할 수 있습니다.
# profiles.yml
duckdb_analytics:
target: dev
outputs:
dev:
type: duckdb
path: analytics.duckdb
threads: 4external source는 DuckDB file scan 문법으로 컴파일될 수 있습니다.
sources:
- name: raw_lake
meta:
external_location: "s3://company-lake/raw/{name}.parquet"
tables:
- name: orders
- name: customersexternal materialization은 dbt 모델 결과를 Parquet/CSV/JSON 파일로 쓸 때 유용합니다. incremental external model은 제한이 있으니 증분 처리는 DuckDB table materialization이나 별도 orchestration으로 나눠 설계합니다.
MotherDuck
DuckDB의 motherduck extension은 MotherDuck 클라우드 warehouse에 연결합니다. 공식 DuckDB 문서는 ATTACH 'md:'로 연결하면 extension이 첫 사용 때 자동으로 설치·로드된다고 설명합니다.
INSTALL md;
LOAD md;
ATTACH 'md:';
SHOW DATABASES;MotherDuck은 "로컬 DuckDB와 같은 SQL을 클라우드로 가져간다"는 점이 강점입니다. 하지만 운영 판단의 기준은 달라집니다.
| 항목 | local DuckDB | MotherDuck |
|---|---|---|
| 데이터 위치 | 로컬/오브젝트 스토리지 | 클라우드 서비스 |
| 권한 | OS/cloud credential 중심 | 서비스 계정·조직 권한 |
| 비용 | 로컬 리소스 중심 | 서비스 과금 |
| 협업 | 파일 공유·read-only | cloud sharing과 BI 연결 |
| 장애 경계 | 로컬 process | 네트워크·서비스 가용성 포함 |
Ibis
Ibis는 DuckDB를 포함한 여러 backend로 SQL을 생성하는 Python dataframe API입니다. DuckDB 문서는 Ibis with DuckDB가 Pythonic interface와 좋은 성능을 제공한다고 설명합니다.
import ibis
con = ibis.connect("duckdb://analytics.duckdb")
orders = con.table("orders")
expr = (
orders
.group_by(["region", "plan"])
.aggregate(revenue=orders.amount.sum())
)
print(expr.compile())
expr.execute()Ibis에서는 Python 코드 리뷰와 SQL 리뷰가 섞입니다. DBA가 검토해야 하는 팀이라면 expr.compile()로 생성 SQL을 CI artifact나 PR에 드러내는 습관을 들이면 좋습니다.
통합 아키텍처
도입 순서
- DuckDB CLI/SQL로 파일 레이크 쿼리와 profiling 기준을 먼저 만든다.
- 반복 변환이 많아지면 dbt-duckdb로 모델·테스트·문서를 올린다.
- Python feature engineering이 많으면 Ibis나 Polars 연동을 표준으로 잡는다.
- 협업, BI 공유, 클라우드 실행이 필요해지면 비용·권한을 따로 검토해 MotherDuck을 도입한다.