Pg_lake - Ekstensi yang mendukung akses Iceberg dan data lake di Postgres
(github.com/Snowflake-Labs)- pg_lake adalah ekstensi berbasis Postgres yang mengintegrasikan tabel Iceberg dan file data lake secara langsung, mendukung transaksi dan kueri berkecepatan tinggi
- Dapat langsung menanyakan, mengimpor, dan mengekspor file Parquet, CSV, JSON, dan Iceberg di object storage seperti S3
- Memanfaatkan mesin kueri DuckDB secara internal untuk memastikan performa eksekusi cepat di dalam lingkungan Postgres
- Menyediakan fitur lakehouse data melalui satu antarmuka SQL, seperti pembuatan tabel Iceberg, inferensi skema otomatis untuk file eksternal, dan I/O S3 melalui perintah COPY
- Setelah Snowflake mengakuisisi Crunchy Data pada 2025, proyek ini dirilis sebagai open source, menjadi fondasi untuk memperluas integrasi data lake di ekosistem Postgres
Ikhtisar pg_lake
- pg_lake adalah ekstensi yang mengintegrasikan file Iceberg dan data lake ke Postgres, sehingga Postgres dapat digunakan sebagai sistem lakehouse mandiri
- Menjamin transaksi untuk tabel Iceberg dan mendukung kueri cepat
- Dapat mengakses langsung file data mentah di object storage seperti S3
- Fitur utama
- Membuat dan memodifikasi tabel Iceberg serta dapat dikueri dari mesin lain
- Menanyakan dan mengimpor file data berformat Parquet, CSV, JSON, dan Iceberg
- Mengekspor hasil kueri ke object storage dalam format Parquet, CSV, dan JSON melalui perintah COPY
- Membaca format data geospasial seperti GeoJSON dan Shapefile yang didukung GDAL
- Menyediakan tipe map bawaan untuk data semi-terstruktur
- Dapat menggabungkan heap, Iceberg, dan file eksternal dalam satu kueri SQL
- Inferensi otomatis kolom dan tipe dari sumber data eksternal
- Eksekusi cepat melalui mesin DuckDB
Instalasi dan konfigurasi
- Cara instalasi
- Menjalankan dengan mudah menggunakan Docker
- Instalasi manual atau penyiapan lingkungan pengembangan melalui build dari source
- Contoh pembuatan ekstensi
CREATE EXTENSION pg_lake CASCADE;- Ekstensi terkait:
pg_lake_table,pg_lake_engine,pg_extension_base,pg_lake_iceberg,pg_lake_copy
- Ekstensi terkait:
- pgduck_server
- Proses independen yang mengimplementasikan wire protocol Postgres dan secara internal menggunakan DuckDB
- Berjalan pada port default 5332 dan dapat diakses langsung dengan
psql - Pengaturan utama
--memory_limit: batas memori (default 80% dari memori sistem)--init_file_path: menentukan file SQL yang dijalankan saat startup--cache_dir: menentukan direktori cache file jarak jauh
- Konfigurasi koneksi S3
- Menggunakan secrets manager DuckDB untuk mengenali kredensial AWS/GCP secara otomatis
- Contoh penentuan lokasi penyimpanan tabel Iceberg
SET pg_lake_iceberg.default_location_prefix TO 's3://testbucketpglake';
Contoh penggunaan
- Membuat tabel Iceberg
CREATE TABLE iceberg_test USING iceberg AS SELECT i as key, 'val_'|| i as val FROM generate_series(0,99)i;- Setelah dibuat, hasil
SELECT count(*) FROM iceberg_test;adalah 100 - Lokasi metadata Iceberg dapat diperiksa
- Setelah dibuat, hasil
- COPY I/O ke dan dari S3
COPY (SELECT * FROM iceberg_test) TO 's3://.../iceberg_test.parquet'; COPY iceberg_test FROM 's3://.../iceberg_test.parquet';- Mendukung format Parquet, CSV, dan JSON
- Membuat file S3 sebagai tabel eksternal
CREATE FOREIGN TABLE parquet_table() SERVER pg_lake OPTIONS (path 's3://.../*.parquet');- Kolom diinferensikan secara otomatis dan dapat dikueri (
SELECT count(*) FROM parquet_table;→ 100)
- Kolom diinferensikan secara otomatis dan dapat dikueri (
Arsitektur
- Komponen
- PostgreSQL + ekstensi pg_lake
- pgduck_server (menjalankan DuckDB dan mengimplementasikan protokol Postgres)
- Cara kerja
- Pengguna terhubung ke Postgres dan menjalankan SQL
- Sebagian kueri dijalankan melalui DuckDB dengan pendekatan paralel dan berorientasi kolom
- DuckDB tidak di-embed ke dalam proses Postgres, sehingga menghindari masalah keamanan thread dan memori
- Mesin DuckDB dapat diakses langsung melalui klien Postgres standar
Daftar detail komponen
- pg_lake_iceberg: implementasi spesifikasi Iceberg
- pg_lake_table: implementasi FDW untuk file di object storage
- pg_lake_copy: mendukung COPY I/O ke dan dari data lake
- pg_lake_engine: modul umum
- pg_extension_base: komponen dasar untuk ekstensi lain
- pg_extension_updater: fitur pembaruan otomatis ekstensi
- pg_lake_benchmark: menjalankan benchmark tabel lake
- pg_map: generator tipe map yang digeneralisasi
- pgduck_server: server yang memuat DuckDB dan mengeksposnya melalui protokol Postgres
- duckdb_pglake: menambahkan fungsi kompatibel Postgres ke DuckDB
Riwayat pengembangan dan rilis
- Pengembangan dimulai pada awal 2024 di Crunchy Data untuk menghadirkan Iceberg ke Postgres
- Awalnya fokus pada integrasi DuckDB dan penyediaan fitur bagi pelanggan Crunchy Bridge
- Setelah itu diimplementasikan dukungan protokol Iceberg v2 dan transaksi
- Diluncurkan kembali pada November 2024 sebagai Crunchy Data Warehouse
- Pada Juni 2025, Snowflake mengakuisisi Crunchy Data, lalu pada November 2025 pg_lake dirilis sebagai open source
- Versi awalnya adalah 3.0 (termasuk dua generasi sebelumnya)
- Pengguna Crunchy Data Warehouse yang ada mendapatkan jalur upgrade otomatis
Lisensi dan dependensi
- Lisensi Apache 2.0
- Bergantung pada proyek Apache Avro dan DuckDB
- Patch diterapkan ke ekstensi Avro dan DuckDB saat build
1 komentar
Komentar Hacker News
Dengan begitu, kompleksitas bisa dikurangi. Yang dibutuhkan hanya DuckDB dan PostgreSQL (pg_duckdb)
Sebagai referensi, ada juga video presentasi Prof. Hannes Mühleisen, DuckLake - The SQL-Powered Lakehouse Format for the Rest of Us
DuckLake bisa melakukan hal-hal yang tidak bisa dilakukan pg_lake berbasis Iceberg, dan sebaliknya Postgres bisa melakukan hal-hal yang tidak bisa dilakukan DuckDB. Misalnya, dapat menangani lebih dari 100 ribu insert baris tunggal per detik
Pemrosesan transaksi tidak datang gratis. Alih-alih menaruh engine di dalam katalog, jika katalog ditaruh di dalam engine maka transaksi antara tabel analitik dan tabel operasional menjadi mungkin
Postgres juga terasa alami dari sisi persistensi dan pemrosesan berkelanjutan. Orkestrasi dapat dibangun dengan pg_cron dan PL/pgSQL
Selain itu, Iceberg juga unggul dalam interoperabilitas dengan berbagai query engine
Saya tidak yakin apakah ini karena pola penulisan data saya (insert dari Polars DataFrame ke tabel Ducklake), atau karena struktur tabel partisi
Di lingkungan pengembangan/pengujian masih oke, tetapi untuk seluruh tim ada kesulitan. Jadi akhirnya kembali ke kombinasi file Parquet berpartisi Hive dan view DuckDB
Nanti saya berniat mengunggah contoh sebagai issue, tetapi saat ini saya kekurangan waktu karena pekerjaan lain
Dulu orang sering bilang tidak ada “Snowflake open source” di pasar Postgres
Ekstensi Postgres dari Crunchy adalah solusi paling maju di pasar saat ini. Selamat kepada Snowflake dan tim Crunchy yang telah merilisnya sebagai open source
Di Linux, kita bisa membaca dan menulis konfigurasi sistem lewat file system (
cat /sys/...,echo ... > /sys/...)Dengan FUSE, kita bahkan bisa mengimplementasikan driver file system langsung di user space. Misalnya me-mount SSH atau Google Drive lalu menyalin dengan perintah
cpNamun file system hanya cocok untuk data hierarkis. Sebagian besar data dunia nyata punya struktur relasional
Data lake memungkinkan berbagai sumber data diperlakukan seperti satu database relasional melalui abstraksi elegan bernama SQL
Pada akhirnya banyak aplikasi berpusat pada CRUD, jadi pendekatan seperti ini jauh lebih efisien
Dalam kasus seperti itu, Postgres punya batas. Dibutuhkan lebih banyak CPU dan RAM, dan pada akhirnya perlu engine terdistribusi
Compute bertanya ke Postgres “apa data saat ini untuk key-key ini?” atau “apa datanya dua minggu lalu?”, lalu kueri analitik yang sebenarnya dijalankan langsung pada file Parquet
Menjalankannya secara lokal dengan Docker memang bagus, tetapi akan lebih baik jika bisa dioperasikan di AWS dengan penagihan terintegrasi ke akun Snowflake
Data Parquet bisa dibawa ke Postgres untuk dikueri, dan juga bisa di-join dengan tabel yang sudah ada
(1) Apakah ada rencana kompatibilitas agar memakai spesifikasi Ducklake alih-alih Iceberg? Ducklake mengelola katalog sebagai tabel SQL, bukan file, sehingga penulisan serentak dan pengelolaan snapshot lebih sederhana
(2) Apakah mungkin pg_duckdb pada akhirnya akan memiliki fungsi yang sama?
Namun ada kompleksitas seperti pemrosesan data inline. Jika itu bisa diatasi, performa transaksi tinggi bisa dicapai
(2) pg_duckdb memang lebih mudah untuk memakai ulang implementasi Ducklake, tetapi dari sisi pengelolaan resource dan stabilitas, menurut saya strukturnya kurang cocok
Anda bisa menjalankan pekerjaan ETL lewat CLI, YAML, dan Python