- pg_lakeは、Postgres を基盤として Iceberg テーブルとデータレイクファイルを直接統合し、トランザクションと高速クエリをサポートする拡張
- S3 などの オブジェクトストレージ上の Parquet、CSV、JSON、Iceberg ファイルを直接参照・取り込み・エクスポート可能
- 内部的に DuckDB クエリエンジンを活用し、Postgres 環境内で高速な実行性能を確保
- Iceberg テーブルの作成、外部ファイルの自動スキーマ推論、COPY コマンドによる S3 入出力など、データレイクハウス機能を単一の SQL インターフェースで提供
- Snowflake が 2025 年に Crunchy Data を買収した後、オープンソースとして公開され、Postgres エコシステムにおけるデータレイク統合を拡張する基盤
pg_lake 概要
- pg_lakeは、Iceberg およびデータレイクファイルを Postgres に統合する拡張機能で、Postgres を単独の レイクハウスシステムとして活用可能
- Iceberg テーブルに対するトランザクション保証と高速クエリをサポート
- S3 などのオブジェクトストレージ上の生データファイルに直接アクセス可能
- 主な機能
- Iceberg テーブルの作成・変更、および他のエンジンからのクエリに対応
- Parquet、CSV、JSON、Iceberg 形式のデータファイルの参照と取り込み
- COPY コマンドでクエリ結果を Parquet、CSV、JSON 形式としてオブジェクトストレージにエクスポート
- GDAL がサポートする GeoJSON、Shapefile などの 地理空間データ形式の読み込み
- 半構造化データ向けの 組み込み map 型を提供
- heap、Iceberg、外部ファイルを 単一の SQL クエリで結合可能
- 外部データソースから カラムと型を自動推論
- DuckDB エンジンによる高速実行
インストールと設定
使用例
- Iceberg テーブルの作成
CREATE TABLE iceberg_test USING iceberg AS
SELECT i as key, 'val_'|| i as val FROM generate_series(0,99)i;
- 作成後、
SELECT count(*) FROM iceberg_test; の結果は 100
- Iceberg メタデータの場所を確認可能
- S3 への COPY 入出力
COPY (SELECT * FROM iceberg_test) TO 's3://.../iceberg_test.parquet';
COPY iceberg_test FROM 's3://.../iceberg_test.parquet';
- S3 ファイルを外部テーブルとして作成
CREATE FOREIGN TABLE parquet_table()
SERVER pg_lake
OPTIONS (path 's3://.../*.parquet');
- カラムを自動推論し、クエリ可能(
SELECT count(*) FROM parquet_table; → 100)
アーキテクチャ
- 構成要素
- PostgreSQL + pg_lake 拡張
- pgduck_server(DuckDB の実行と Postgres プロトコルの実装)
- 動作方式
- ユーザーは Postgres に接続して SQL を実行
- クエリの一部は DuckDB を通じて並列・カラム指向方式で実行
- DuckDB を Postgres プロセス内に埋め込まないことで、スレッド・メモリ安全性の問題を回避
- 標準的な Postgres クライアントを通じて DuckDB エンジンへ直接アクセス可能
構成要素の詳細一覧
- pg_lake_iceberg: Iceberg 仕様の実装
- pg_lake_table: オブジェクトストレージファイル向け FDW 実装
- pg_lake_copy: データレイクへの COPY 入出力をサポート
- pg_lake_engine: 共通モジュール
- pg_extension_base: 他の拡張の基盤コンポーネント
- pg_extension_updater: 拡張自動更新機能
- pg_lake_benchmark: レイクテーブルのベンチマークを実行
- pg_map: 汎用 map 型ジェネレーター
- pgduck_server: DuckDB をロードし、Postgres プロトコルで公開するサーバー
- duckdb_pglake: DuckDB に Postgres 互換関数を追加
開発と公開の経緯
- 2024 年初頭、Crunchy Dataで Iceberg を Postgres に導入するための開発を開始
- 当初は DuckDB 統合と Crunchy Bridge 顧客向け機能の提供からスタート
- その後、Iceberg v2 プロトコルとトランザクションサポートを実装
- 2024 年 11 月、Crunchy Data Warehouseとして再リリース
- 2025 年 6 月、Snowflake が Crunchy Data を買収し、2025 年 11 月に pg_lake をオープンソース公開
- 初期バージョンは 3.0(それ以前の 2 世代を含む)
- 既存の Crunchy Data Warehouse 利用者には自動アップグレード経路を提供
ライセンスと依存関係
- Apache 2.0 ライセンス
- Apache Avro および DuckDB プロジェクトに依存
- ビルド時に Avro および DuckDB 拡張へパッチを適用
1件のコメント
Hacker Newsのコメント
そうすれば 複雑さを減らせる。必要なのは DuckDB と PostgreSQL(pg_duckdb)だけ
参考までに、Prof. Hannes Mühleisen による発表動画 DuckLake - The SQL-Powered Lakehouse Format for the Rest of Us もある
DuckLake は Iceberg ベースの pg_lake にできないことができるし、逆に Postgres は DuckDB にできないことができる。たとえば、1 秒あたり 10 万件を超える単一行挿入を処理できる
トランザクション処理はただでは手に入らない。エンジンをカタログの中に入れる代わりに、カタログをエンジンの中に入れれば、分析用テーブルと運用用テーブルの間でトランザクションが可能になる
Postgres は永続性(persistence)と 継続的処理 の面でも自然。pg_cron と PL/pgSQL を使ってオーケストレーションを構築できる
また、Iceberg は複数のクエリエンジンとの相互運用性にも強みがある
それが自分のデータ書き込みパターン(Polars DataFrame から Ducklake テーブルへの挿入)のせいなのか、パーティションテーブルの構造のせいなのかははっきりしない
開発・テスト環境では問題なかったが、チーム全体で使うには難しさがあった。そこで結局、Hive パーティション化された Parquet ファイルと DuckDB ビューの組み合わせに戻った
あとで issue に例を上げるつもりだが、今は他の作業で時間が足りない
以前は Postgres 市場には「オープンソースの Snowflake」がないと言われていた
Crunchy の Postgres 拡張は、現時点の市場で最も先を行くソリューションだ。Snowflake と Crunchy のチームがこれをオープンソースとして公開したことを祝福したい
Linux ではファイルシステムを通じてシステム設定を読み書きできる(
cat /sys/...,echo ... > /sys/...)FUSE を使えば、ユーザー空間でファイルシステムドライバを直接実装できる。たとえば SSH や Google Drive をマウントして、
cpコマンドでコピーできるしかしファイルシステムは階層型データにしか向いていない。現実世界のデータの大半は リレーショナル構造 だ
データレイクは SQL というエレガントな抽象化を通じて、異なるデータソースを 1 つのリレーショナルデータベースのように扱えるようにする
結局、多くのアプリケーションは CRUD 中心なので、このアプローチの方がはるかに効率的だ
こういう場合、Postgres には限界がある。より多くの CPU と RAM が必要になり、最終的には 分散エンジン が必要になる
コンピュートは Postgres に「これらのキーの現在のデータは?」あるいは「2 週間前のデータは?」と問い合わせ、実際の分析クエリは Parquet ファイルに対して直接実行する
ローカルの Docker で動かせるのはよいが、AWS 上で Snowflake アカウントに統合請求される形で運用できるとうれしい
Parquet データを Postgres に取り込んでクエリでき、既存テーブルと 結合 することも可能
(1) Iceberg の代わりに Ducklake 仕様を使う互換計画はあるのか? Ducklake はカタログをファイルではなく SQL テーブルで管理するので、同時書き込み やスナップショット管理がより簡単になる
(2) pg_duckdb が将来的に同じ機能を担う可能性はあるのか?
ただし、インラインデータ処理などの複雑さがある。そこを解決できれば、高いトランザクション性能が得られる
(2) pg_duckdb は Ducklake の実装を再利用しやすいが、リソース管理や安定性の面では、その構造はあまり適していないと考えている
CLI、YAML、Python で ETL ジョブ を実行できる