本文へスキップ
hdknr blog

DuckLake

DuckDB チームのレイクハウスフォーマット。データは Parquet でオブジェクトストレージに、メタデータはすべて PostgreSQL などの SQL データベースに置く

概要

DuckLake は、DuckDB の開発チームが作ったレイクハウスフォーマット。データは Parquet ファイルとして S3 などに置き、メタデータはすべてカタログデータベース(PostgreSQL・SQLite・DuckDB など)に格納する。2025 年 5 月 27 日に発表、v1.0 は 2026 年 4 月 13 日(DuckDB v1.5.2 の ducklake 拡張で利用可能)。仕様と拡張はどちらも MIT ライセンスで、v1.0 は後方互換性が保証された本番利用向けの仕様として出された。

詳細

なぜメタデータを SQL データベースに置くのか

DuckLake Manifesto の出発点は「Iceberg や Delta Lake はデータベースを使わずに済むよう設計されたのに、結局カタログ層でデータベースを使っている。ならば残りのメタデータも全部そこに入れればいい」という主張。ファイルベースのメタデータの問題として次を挙げる。

DuckLake の書き込みは「Parquet を置く」→「ファイル・統計・スナップショットを 1 つの SQL トランザクションで記録」の 2 段階。スナップショットもテーブルの行にすぎない。なお「PostgreSQL カタログで数百 TB・数千ノードまでスケール」といった数字は開発チームの設計上の見込みで、第三者のベンチマークではない。

DuckDB での使い方

INSTALL ducklake; のうえで ATTACH 'ducklake:<カタログの場所>' AS my_ducklake; するだけで、普通のテーブルと同じように SQL を書ける。変更のたびにスナップショットが作られ、my_ducklake.snapshots() で一覧、AT (VERSION => n) でタイムトラベルできる。

カタログ向いている用途注意点
DuckDB ファイル1 人でローカルクライアントは 1 つ
SQLiteローカルで複数クライアント読み取りと書き込みを同時にはできない
PostgreSQL複数ユーザー・リモートPostgreSQL 12 以上
MySQL—DuckDB の MySQL コネクタの制約による既知の問題があり、公式には推奨されていない

PostgreSQL カタログ(ducklake:postgres:dbname=...)とオブジェクトストレージの DATA_PATH を組み合わせると、複数の DuckDB プロセスが同じデータセットを同時に読み書きできる。素の DuckDB ファイルは 1 プロセスしか書き込めないので、DuckDB をマルチユーザー化する手段にもなる。

v1.0 の主な機能

Iceberg との互換性と移行

データファイルと positional delete ファイルは Iceberg 互換。DuckDB の iceberg 拡張と組み合わせて移行できる。

まず DuckLake で小さく始め、他エンジンが必要になったら Iceberg へ移す道が残る。

Iceberg との使い分け

観点Apache IcebergDuckLake
メタデータS3 上のファイル+カタログSQL データベース
対応エンジンSpark、Trino、Flink、Athena、Snowflake、DuckDB など多数DuckDB 中心(Spark・Trino・DataFusion 向けクライアントも登場)
運用に必要なものカタログサービス(Glue、S3 Tables、REST)PostgreSQL などの RDB
小さな書き込み小さなファイルが増えコンパクションが必要data inlining でカタログに吸収
ガバナンスApache Software FoundationDuckDB チーム(MIT)

判断材料は、エンジンの多様性が要るか、小さな書き込みの頻度(ストリーミングなら DuckLake 有利)、PostgreSQL を運用できるか(カタログ DB の可用性とバックアップがそのままデータ基盤の信頼性になる)。

関連ページ

ソース記事