- pg_lake เป็นส่วนขยายที่ผสาน ตาราง Iceberg และไฟล์ดาต้าเลกเข้ากับ Postgres ได้โดยตรง เพื่อรองรับทรานแซกชันและการคิวรีความเร็วสูง
- สามารถ คิวรี นำเข้า และส่งออกไฟล์ Parquet, CSV, JSON และ Iceberg บน object storage เช่น S3 ได้โดยตรง
- ใช้ DuckDB query engine ภายในเพื่อให้ได้ประสิทธิภาพการรันที่รวดเร็วในสภาพแวดล้อม Postgres
- มอบ ความสามารถแบบ data lakehouse ผ่าน SQL interface เดียว เช่น การสร้างตาราง Iceberg, การอนุมานสคีมาของไฟล์ภายนอกอัตโนมัติ, และการรับส่งข้อมูลกับ S3 ผ่านคำสั่ง COPY
- หลังจาก Snowflake เข้าซื้อ Crunchy Data ในปี 2025 ก็ได้ เปิดซอร์สโค้ด เพื่อเป็นฐานในการขยายการผสานดาต้าเลกใน ecosystem ของ Postgres
ภาพรวมของ pg_lake
- pg_lake เป็นส่วนขยายที่ผสาน Iceberg และไฟล์ดาต้าเลกเข้ากับ Postgres ทำให้สามารถใช้ Postgres เป็น ระบบเลกเฮาส์ แบบสแตนด์อโลนได้
- รับประกันทรานแซกชันสำหรับตาราง Iceberg และรองรับการคิวรีที่รวดเร็ว
- เข้าถึงไฟล์ข้อมูลดิบบน object storage เช่น S3 ได้โดยตรง
- ความสามารถหลัก
- สร้างและแก้ไขตาราง Iceberg และให้เอนจินอื่นคิวรีได้
- คิวรีและนำเข้าข้อมูลไฟล์ในรูปแบบ Parquet, CSV, JSON และ Iceberg
- ส่งออกผลลัพธ์ของคิวรีไปยัง object storage ในรูปแบบ Parquet, CSV, JSON ด้วยคำสั่ง COPY
- อ่าน รูปแบบข้อมูลเชิงภูมิศาสตร์ เช่น GeoJSON และ Shapefile ที่ GDAL รองรับ
- มี map type ในตัว สำหรับข้อมูลกึ่งโครงสร้าง
- สามารถ รวม heap, Iceberg และไฟล์ภายนอกไว้ใน SQL query เดียวกัน
- อนุมานคอลัมน์และชนิดข้อมูลอัตโนมัติ จากแหล่งข้อมูลภายนอก
- ประมวลผลความเร็วสูงด้วย DuckDB engine
การติดตั้งและการตั้งค่า
ตัวอย่างการใช้งาน
- การสร้างตาราง 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
- สามารถตรวจสอบตำแหน่ง metadata ของ Iceberg ได้
- COPY รับส่งข้อมูลกับ S3
COPY (SELECT * FROM iceberg_test) TO 's3://.../iceberg_test.parquet';
COPY iceberg_test FROM 's3://.../iceberg_test.parquet';
- รองรับรูปแบบ Parquet, CSV, JSON
- สร้างตารางภายนอกจากไฟล์บน 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 และ implement โปรโตคอล Postgres)
- วิธีการทำงาน
- ผู้ใช้เชื่อมต่อกับ Postgres เพื่อรัน SQL
- บางส่วนของคิวรีจะถูกรันผ่าน DuckDB แบบขนานและเชิงคอลัมน์
- ไม่ฝัง DuckDB ไว้ภายในโปรเซสของ Postgres จึง หลีกเลี่ยงปัญหาด้าน thread และ memory safety
- เข้าถึง DuckDB engine ได้โดยตรงผ่านไคลเอนต์ Postgres มาตรฐาน
รายการองค์ประกอบโดยละเอียด
- pg_lake_iceberg: implement สเปก Iceberg
- pg_lake_table: implement FDW สำหรับไฟล์บน object storage
- pg_lake_copy: รองรับ COPY รับส่งข้อมูลกับดาต้าเลก
- pg_lake_engine: โมดูลส่วนกลาง
- pg_extension_base: องค์ประกอบพื้นฐานสำหรับส่วนขยายอื่น
- pg_extension_updater: ความสามารถอัปเดตส่วนขยายอัตโนมัติ
- pg_lake_benchmark: ใช้รันเบนช์มาร์กของตารางเลก
- pg_map: ตัวสร้าง map type แบบทั่วไป
- pgduck_server: เซิร์ฟเวอร์ที่โหลด DuckDB และเปิดใช้งานผ่านโปรโตคอล Postgres
- duckdb_pglake: เพิ่มฟังก์ชันที่เข้ากันได้กับ Postgres ให้ DuckDB
ประวัติการพัฒนาและการเปิดเผย
- เริ่มพัฒนาในต้นปี 2024 ที่ Crunchy Data เพื่อนำ Iceberg มาใช้กับ Postgres
- ช่วงแรกมุ่งไปที่การผสาน DuckDB และการให้ความสามารถแก่ลูกค้า Crunchy Bridge
- ต่อมาได้ implement โปรโตคอล Iceberg v2 และรองรับทรานแซกชัน
- เดือนพฤศจิกายน 2024 เปิดตัวอีกครั้งในชื่อ Crunchy Data Warehouse
- เดือนมิถุนายน 2025 Snowflake เข้าซื้อ Crunchy Data และเดือนพฤศจิกายน 2025 เปิดซอร์สโค้ด pg_lake
- เวอร์ชันเริ่มต้นคือ 3.0 (รวมสองเจเนอเรชันก่อนหน้า)
- ผู้ใช้ 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 ทำบางอย่างที่ pg_lake ซึ่งอิงกับ Iceberg ทำไม่ได้ และในทางกลับกัน Postgres ก็ทำบางอย่างที่ DuckDB ทำไม่ได้ เช่นรองรับการแทรกข้อมูลทีละแถวได้มากกว่า 100,000 รายการต่อวินาที
การประมวลผลธุรกรรม ไม่ได้มาฟรี ๆ ถ้าแทนที่จะเอาเอนจินไปไว้ในแค็ตตาล็อก แล้วเอาแค็ตตาล็อกมาไว้ในเอนจิน ก็จะสามารถทำธุรกรรมระหว่างตารางสำหรับงานวิเคราะห์กับตารางสำหรับงานปฏิบัติการได้
Postgres ยังดูเป็นธรรมชาติกว่าในแง่ของ persistence และ การประมวลผลแบบต่อเนื่อง ด้วย สามารถจัดทำ orchestration ได้ด้วย pg_cron และ PL/pgSQL
อีกอย่าง Iceberg ก็มีจุดแข็งด้านการทำงานร่วมกับหลาย query engine
ไม่แน่ใจว่าเป็นเพราะแพตเทิร์นการเขียนข้อมูลของฉัน (แทรกจาก Polars DataFrame ไปยังตาราง Ducklake) หรือเป็นเพราะโครงสร้างตารางแบบ partition
ในสภาพแวดล้อมพัฒนา/ทดสอบมันโอเค แต่พอใช้ทั้งทีมกลับมีปัญหา สุดท้ายเลยกลับไปใช้ไฟล์ Parquet แบบ Hive-partitioned ร่วมกับ DuckDB view
ตั้งใจว่าจะเอาตัวอย่างไปเปิดเป็น issue ทีหลัง แต่ตอนนี้ยังไม่มีเวลาเพราะติดงานอื่น
เมื่อก่อนฉันมักพูดว่าในตลาด Postgres ยังไม่มี “โอเพนซอร์ส Snowflake”
ส่วนขยาย Postgres ของ Crunchy ตอนนี้เป็นโซลูชันที่ล้ำหน้าที่สุดในตลาด ขอแสดงความยินดีกับ Snowflake และทีม Crunchy ที่ปล่อยสิ่งนี้เป็นโอเพนซอร์ส
บน Linux เราสามารถอ่านและเขียนค่าตั้งค่าระบบผ่านไฟล์ซิสเต็มได้ (
cat /sys/...,echo ... > /sys/...)ด้วย FUSE คุณสามารถเขียนไดรเวอร์ไฟล์ซิสเต็มใน userspace ได้เอง เช่นเมานต์ SSH หรือ Google Drive แล้วคัดลอกด้วยคำสั่ง
cpแต่ไฟล์ซิสเต็มเหมาะกับข้อมูลแบบลำดับชั้นเท่านั้น ข้อมูลในโลกจริงส่วนใหญ่เป็น โครงสร้างเชิงสัมพันธ์
ดาต้าเลกทำให้เราจัดการแหล่งข้อมูลที่ต่างกันเสมือนเป็นฐานข้อมูลเชิงสัมพันธ์เดียวกันได้ ผ่านนามธรรมอันสวยงามของ SQL
และเพราะท้ายที่สุดแล้วแอปจำนวนมากก็เน้น CRUD แนวทางนี้จึงมีประสิทธิภาพกว่ามาก
ในกรณีแบบนี้ Postgres มีข้อจำกัด ต้องใช้ CPU และ RAM มากขึ้น และสุดท้ายก็ต้องพึ่ง เอนจินแบบกระจาย
ส่วน compute จะถาม Postgres ว่า “ข้อมูลล่าสุดของคีย์เหล่านี้คืออะไร?” หรือ “ข้อมูลเมื่อ 2 สัปดาห์ก่อนคืออะไร?” แล้ว query วิเคราะห์จริง ๆ จะไปรันกับไฟล์ Parquet โดยตรง
การรันบน Docker ในเครื่องก็ดี แต่ถ้าสามารถใช้งานบน AWS พร้อมรวมบิลผ่านบัญชี Snowflake ได้ก็น่าจะดีมาก
คุณสามารถดึงข้อมูล Parquet มา query ใน Postgres ได้ และยัง join กับตารางเดิมได้ด้วย
(1) มีแผนจะรองรับการใช้สเปก Ducklake แทน Iceberg หรือไม่? Ducklake จัดการแค็ตตาล็อกด้วยตาราง SQL แทนไฟล์ ทำให้ การเขียนพร้อมกัน หรือการจัดการ snapshot ง่ายกว่า
(2) เป็นไปได้ไหมว่า pg_duckdb เมื่อเวลาผ่านไปจะทำฟังก์ชันเดียวกันได้?
อย่างไรก็ตามยังมีความซับซ้อน เช่นการจัดการข้อมูลแบบ inline แต่ถ้าแก้ได้ก็จะได้ประสิทธิภาพธุรกรรมที่สูง
(2) สำหรับ pg_duckdb นั้นอาจนำ implementation ของ Ducklake มาใช้ซ้ำได้ง่ายกว่า แต่ในมุมของการจัดการทรัพยากรและเสถียรภาพ เรามองว่าโครงสร้างแบบนั้นเหมาะน้อยกว่า
คุณสามารถรัน งาน ETL ได้ผ่าน CLI, YAML และ Python