pg_lake

Snowflake 开源的 PostgreSQL 数据湖与 Iceberg 集成扩展

概览

扩展包名版本分类许可证语言
pg_lake3.4OLAPApache-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
2560pg_lakelake
2561pg_extension_baseextension_base
2562pg_extension_updaterextension_updater
2563pg_mapmap_type
2564pg_lake_engine__lake__internal__nsp__
2565pg_lake_iceberglake_iceberg
2566pg_lake_table__pg_lake_table_writes
2567pg_lake_copypg_catalog
相关扩展pg_lake_copy pg_lake_table duckdb_fdw pg_duckdb pg_ducklake pg_mooncake pg_parquet

Pigsty packages this release for PG16-18. Configure shared_preload_libraries=pg_extension_base and run the matching PG-major pgduck_server process. RPM supports EL9/EL10 only; EL8 is rejected because OpenSSL 3 is required. DEB supports Debian 12/13 and Ubuntu 22.04/24.04/26.04 on amd64/arm64. DuckDB and Avro are private per PG major. Co-installation with pg_duckdb, pg_mooncake, and duckdb_fdw is file-safe, but overlapping hooks and COPY behavior can be preload-order-sensitive. Extension SQL/control version is 3.4; source and DEB/RPM package version is 3.4.0.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY3.41817161514pg_lakepg_lake_copy, pg_lake_table
RPMPIGSTY3.4.01817161514pg_lake_$v-
DEBPIGSTY3.4.01817161514postgresql-$v-pg-lake-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64N/AN/AN/AN/AN/A
el8.aarch64N/AN/AN/AN/AN/A
el9.x86_64N/AN/A
el9.aarch64N/AN/A
el10.x86_64N/AN/A
el10.aarch64N/AN/A
d12.x86_64N/AN/A
d12.aarch64N/AN/A
d13.x86_64N/AN/A
d13.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/AN/A
u22.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/AN/A
u22.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/AN/A
u24.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/AN/A
u24.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/AN/A
u26.x86_64N/AN/A
u26.aarch64N/AN/A

构建

您可以使用 pig build 命令构建 pg_lake 扩展的 RPM / DEB 包:

pig build pkg pg_lake         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_lake 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_lake;          # 当前活跃 PG 版本安装
pig ext install -y pg_lake -v 18  # PG 18
pig ext install -y pg_lake -v 17  # PG 17
pig ext install -y pg_lake -v 16  # PG 16
dnf install -y pg_lake_18       # PG 18
dnf install -y pg_lake_17       # PG 17
dnf install -y pg_lake_16       # PG 16
apt install -y postgresql-18-pg-lake   # PG 18
apt install -y postgresql-17-pg-lake   # PG 17
apt install -y postgresql-16-pg-lake   # PG 16

预加载配置

shared_preload_libraries = 'pg_extension_base';

创建扩展

CREATE EXTENSION pg_lake CASCADE;  -- 依赖: pg_lake_copy, pg_lake_table

用法

来源:

pg_lake是Snowflake的PostgreSQL湖库堆栈中的顶级扩展。它安装了查询对象存储文件所需的表、Iceberg、复制、查询引擎、基础扩展和映射组件,从而创建事务性的Iceberg表。这些PostgreSQL扩展协调规划和事务处理,而一个单独的本地pgduck_server进程使用DuckDB执行向量化工作。

启动堆栈

版本3.4支持PostgreSQL 16至18。预加载通用扩展基础设施,重启PostgreSQL,并在数据库主机上启动pgduck_server

shared_preload_libraries = 'pg_extension_base'
pgduck_server --cache_dir /var/cache/pg_lake

在目标数据库中创建完整的依赖树:

CREATE EXTENSION pg_lake CASCADE;
SELECT lake.version();

pgduck_server配置对象存储凭证,然后选择托管的Iceberg位置:

SET pg_lake_iceberg.default_location_prefix =
    's3://analytics-bucket/warehouse';

核心工作流

创建和修改事务性的Iceberg表:

CREATE TABLE measurements (
    station_name text NOT NULL,
    measured_at timestamptz NOT NULL,
    value double precision
) USING iceberg;

INSERT INTO measurements VALUES
    ('Istanbul', now(), 18.5),
    ('Haarlem', now(), 9.3);

通过COPY导入或导出Parquet、CSV或换行符分隔的JSON文件:

COPY (SELECT * FROM measurements)
TO 's3://analytics-bucket/export/measurements.parquet';

COPY measurements
FROM 's3://analytics-bucket/import/measurements.parquet';

查询文件而不将其加载到PostgreSQL中:

CREATE FOREIGN TABLE external_events ()
SERVER pg_lake
OPTIONS (path 's3://analytics-bucket/events/*.parquet');

SELECT count(*) FROM external_events;

组件索引

  • pg_lake:元扩展和lake.version()
  • pg_lake_table:数据湖FDW、Iceberg表语法、文件工具和表目录。
  • pg_lake_iceberg:Iceberg的元数据、快照、清单和目录集成。
  • pg_lake_copy:对对象存储文件和湖格式的COPY拦截。
  • pg_lake_engine:共享查询重写、类型转换、清理和pgduck_server客户端层。
  • pg_extension_base:预加载和生命周期工作进程基础设施。
  • pg_map:用于嵌套湖数据的生成PostgreSQL映射类型。

运营注意事项

  • 对于湖查询,pgduck_server是必需的,并且必须具有从PostgreSQL到对象存储的有效凭证和本地套接字连接。
  • S3及其兼容凭证由DuckDB的秘密/凭证链解析。仅授予工作负载所需的桶权限。
  • Iceberg写入按语句创建Parquet文件。批量插入并定期运行VACUUM以避免产生许多小文件。
  • 这些PostgreSQL扩展、pgduck_server对象存储数据和Iceberg目录形成一个部署单元。单独创建扩展不足以证明外部服务可用,需要分别备份和升级它们。