- pg_lake là một tiện ích mở rộng dựa trên Postgres, tích hợp trực tiếp bảng Iceberg và các tệp data lake để hỗ trợ giao dịch và truy vấn tốc độ cao
- Có thể truy vấn trực tiếp, nhập và xuất các tệp Parquet, CSV, JSON, Iceberg trên object storage như S3
- Tận dụng bộ máy truy vấn DuckDB ở bên trong để đạt hiệu năng thực thi nhanh trong môi trường Postgres
- Cung cấp các tính năng lakehouse như tạo bảng Iceberg, tự động suy luận schema cho tệp bên ngoài, I/O với S3 qua lệnh COPY bằng một giao diện SQL duy nhất
- Sau khi Snowflake mua lại Crunchy Data vào năm 2025, dự án được công bố dưới dạng mã nguồn mở, tạo nền tảng mở rộng tích hợp data lake trong hệ sinh thái Postgres
Tổng quan về pg_lake
- pg_lake là tiện ích mở rộng tích hợp Iceberg và các tệp data lake vào Postgres, cho phép sử dụng Postgres như một hệ thống lakehouse độc lập
- Đảm bảo giao dịch và hỗ trợ truy vấn nhanh cho các bảng Iceberg
- Có thể truy cập trực tiếp các tệp dữ liệu thô trên object storage như S3
- Các tính năng chính
- Tạo và chỉnh sửa bảng Iceberg, đồng thời cho phép các engine khác truy vấn
- Truy vấn và nhập các tệp dữ liệu ở định dạng Parquet, CSV, JSON, Iceberg
- Xuất kết quả truy vấn lên object storage ở định dạng Parquet, CSV, JSON bằng lệnh COPY
- Đọc các định dạng dữ liệu không gian địa lý như GeoJSON, Shapefile do GDAL hỗ trợ
- Cung cấp kiểu map tích hợp sẵn cho dữ liệu bán cấu trúc
- Có thể kết hợp heap, Iceberg và tệp ngoài trong một truy vấn SQL duy nhất
- Tự động suy luận cột và kiểu dữ liệu từ nguồn dữ liệu bên ngoài
- Thực thi tốc độ cao nhờ engine DuckDB
Cài đặt và cấu hình
Ví dụ sử dụng
- Tạo bảng Iceberg
CREATE TABLE iceberg_test USING iceberg AS
SELECT i as key, 'val_'|| i as val FROM generate_series(0,99)i;
- Sau khi tạo,
SELECT count(*) FROM iceberg_test; cho kết quả 100
- Có thể kiểm tra vị trí metadata của Iceberg
- COPY vào/ra S3
COPY (SELECT * FROM iceberg_test) TO 's3://.../iceberg_test.parquet';
COPY iceberg_test FROM 's3://.../iceberg_test.parquet';
- Hỗ trợ các định dạng Parquet, CSV, JSON
- Tạo bảng ngoài từ tệp trên S3
CREATE FOREIGN TABLE parquet_table()
SERVER pg_lake
OPTIONS (path 's3://.../*.parquet');
- Tự động suy luận cột và có thể truy vấn (
SELECT count(*) FROM parquet_table; → 100)
Kiến trúc
- Các thành phần
- PostgreSQL + extension pg_lake
- pgduck_server (thực thi DuckDB và triển khai giao thức Postgres)
- Cách hoạt động
- Người dùng kết nối vào Postgres và chạy SQL
- Một phần truy vấn được thực thi qua DuckDB theo hướng song song và dạng cột
- Không nhúng DuckDB trực tiếp vào bên trong tiến trình Postgres nên tránh được các vấn đề về an toàn luồng và bộ nhớ
- Có thể truy cập trực tiếp engine DuckDB thông qua client Postgres tiêu chuẩn
Danh sách chi tiết các thành phần
- pg_lake_iceberg: triển khai đặc tả Iceberg
- pg_lake_table: triển khai FDW cho các tệp trên object storage
- pg_lake_copy: hỗ trợ COPY vào/ra data lake
- pg_lake_engine: mô-đun dùng chung
- pg_extension_base: thành phần nền tảng cho các extension khác
- pg_extension_updater: chức năng tự động cập nhật extension
- pg_lake_benchmark: chạy benchmark cho lake table
- pg_map: bộ tạo kiểu map tổng quát
- pgduck_server: máy chủ nạp DuckDB và phơi bày qua giao thức Postgres
- duckdb_pglake: bổ sung các hàm tương thích Postgres cho DuckDB
Lịch sử phát triển và công bố
- Đầu năm 2024, Crunchy Data bắt đầu phát triển để đưa Iceberg vào Postgres
- Ban đầu tích hợp DuckDB và cung cấp tính năng cho khách hàng của Crunchy Bridge
- Sau đó triển khai giao thức Iceberg v2 và hỗ trợ giao dịch
- Tháng 11 năm 2024, tái ra mắt dưới tên Crunchy Data Warehouse
- Tháng 6 năm 2025, Snowflake mua lại Crunchy Data, và đến tháng 11 năm 2025 pg_lake được công bố mã nguồn mở
- Phiên bản đầu tiên là 3.0 (bao gồm hai thế hệ trước đó)
- Người dùng Crunchy Data Warehouse hiện tại có lộ trình nâng cấp tự động
Giấy phép và phụ thuộc
- Giấy phép Apache 2.0
- Phụ thuộc vào các dự án Apache Avro và DuckDB
- Áp dụng bản vá cho extension Avro và DuckDB trong quá trình build
1 bình luận
Ý kiến Hacker News
Làm vậy có thể giảm độ phức tạp. Chỉ cần DuckDB và PostgreSQL (pg_duckdb) là đủ
Nhân tiện, cũng có video bài trình bày của GS. Hannes Mühleisen: DuckLake - The SQL-Powered Lakehouse Format for the Rest of Us
DuckLake có thể làm những việc dựa trên Iceberg mà pg_lake không làm được, và ngược lại Postgres cũng làm được những việc DuckDB không làm được. Ví dụ, nó có thể xử lý hơn 100 nghìn lượt chèn từng dòng mỗi giây
Xử lý giao dịch không phải miễn phí. Thay vì đặt engine vào trong catalog, nếu đặt catalog vào trong engine thì sẽ có thể thực hiện giao dịch giữa các bảng phân tích và bảng vận hành
Postgres cũng tự nhiên hơn về mặt tính bền vững và xử lý liên tục. Có thể xây dựng orchestration bằng pg_cron và PL/pgSQL
Ngoài ra, Iceberg còn có ưu thế về khả năng tương tác với nhiều query engine khác nhau
Tôi không chắc đó là do kiểu ghi dữ liệu của mình (chèn từ Polars DataFrame vào bảng Ducklake), hay do cấu trúc bảng phân vùng
Trong môi trường dev/test thì ổn, nhưng với cả nhóm thì có khó khăn. Vì vậy cuối cùng tôi quay lại dùng kết hợp file Parquet phân vùng theo Hive và view DuckDB
Sau này tôi định đăng ví dụ thành issue, nhưng hiện giờ đang thiếu thời gian vì bận việc khác
Trước đây người ta thường nói rằng thị trường Postgres không có một “Snowflake mã nguồn mở”
Extension Postgres của Crunchy hiện là giải pháp đi trước nhất trên thị trường. Xin chúc mừng Snowflake và đội Crunchy vì đã phát hành mã nguồn mở
Trên Linux, có thể đọc và ghi cấu hình hệ thống thông qua file system (
cat /sys/...,echo ... > /sys/...)Với FUSE, có thể tự triển khai file system driver trong user space. Ví dụ, có thể mount SSH hoặc Google Drive rồi sao chép bằng lệnh
cpNhưng file system chỉ phù hợp với dữ liệu có cấu trúc phân cấp. Dữ liệu trong thế giới thực phần lớn có cấu trúc quan hệ
Data lake cho phép xử lý nhiều nguồn dữ liệu khác nhau như một cơ sở dữ liệu quan hệ duy nhất thông qua sự trừu tượng thanh lịch là SQL
Cuối cùng, vì nhiều ứng dụng xoay quanh CRUD, cách tiếp cận này hiệu quả hơn nhiều
Trong những trường hợp như vậy, Postgres có giới hạn. Cần nhiều CPU và RAM hơn, và cuối cùng sẽ cần đến engine phân tán
Compute sẽ hỏi Postgres kiểu như “dữ liệu hiện tại của các khóa này là gì?” hoặc “dữ liệu của 2 tuần trước là gì?”, còn các truy vấn phân tích thực tế thì thực hiện trực tiếp trên file Parquet
Chạy được bằng Docker cục bộ thì tốt, nhưng sẽ hay hơn nếu có thể vận hành trên AWS với hình thức gộp hóa đơn vào tài khoản Snowflake
Có thể nạp dữ liệu Parquet vào Postgres để truy vấn, đồng thời join với các bảng hiện có
(1) Có kế hoạch tương thích để dùng đặc tả Ducklake thay vì Iceberg không? Ducklake quản lý catalog bằng bảng SQL thay vì file, nên ghi đồng thời hay quản lý snapshot đơn giản hơn
(2) Liệu pg_duckdb theo thời gian có khả năng cung cấp cùng chức năng đó không?
Tuy vậy vẫn có độ phức tạp, như xử lý dữ liệu inline. Nếu giải quyết được phần này thì có thể đạt hiệu năng giao dịch cao
(2) pg_duckdb có thể dễ tái sử dụng phần triển khai Ducklake hơn, nhưng về quản lý tài nguyên hay độ ổn định thì chúng tôi thấy cấu trúc đó kém phù hợp hơn
Có thể chạy các tác vụ ETL bằng CLI, YAML và Python