Apache Paimon PPMC 正式发布 Apache Paimon 0.6.0 孵化版本。共有 58 人参与了该版本的开发,并完成了 400 多条提交。感谢所有贡献者的支持!
一些突出的进展如下:
- Flink Paimon CDC 支持目前大部分的主流数据源。
- Flink 1.18 和 Paimon 支持 CALL 过程,这将使表管理变得更容易。
- 跨分区更新可用于生产!
- 引入了读优化表 (T$ro),以提高查询性能。
- Append 表生产可用!
- Paimon Presto 模块生产可用!
- Metrics 系统与 Flink Metrics 集成
- Spark Paimon 取得巨大进步
详情请参考下文。
Flink
Paimon CDC
Paimon CDC 集成了 Flink CDC、Kafka、Pulsar 等,并在 0.6 版本中提供了全面的支持:
- Kafka CDC 支持的格式 Canal Json、Debezium Json、Maxwell 和 OGG。
- 新增 Pulsar CDC,包括表同步和整库同步。
- Mongo CDC 可用于生产!
Flink Batch Source
默认情况下,批量读取的并行性与 Split 数相同,而流读取的并行性与桶数相同,但不会大于 scan.infer-parallelism.max(默认为 1024)。
Flink Streaming Source
Consumer-id 可用于生产!
当流式读表记录消耗 Paimon 中的快照 id 时,可以指定 consumer-id,新启动的作业可以继续消耗之前的进度,而无需从状态中恢复。你也可以将 consumer.mode 设为 at-least-once 以获得更好的 Checkpoint 顺滑度。
Flink Time Travel
Flink 1.18 SQL 支持时间旅行查询(也可使用 dynamic option):
SELECT * FROM t FOR SYSTEM_TIME AS OF TIMESTAMP '2023-01-01 00:00:00';
Flink Call Procedures
Flink 1.18 SQL 支持以下 Call Procedures:
Procedure Name |
Example |
compact |
CALL sys.compact('default.T', 'p=0', 'zorder', 'a,b', 'sink.parallelism=4') |
compact_database |
CALL sys.compact_database('db1|db2', 'combined', 'table_.*', 'ignore', 'sink.parallelism=4') |
create_tag |
CALL sys.create_tag('default.T', 'my_tag', 10) |
delete_tag |
CALL sys.delete_tag('default.T', 'my_tag') |
merge_into |
CALL sys.merge_into('default.T', '', '', 'default.S', 'T.id=S.order_id', '', 'price=T.price+20', '', '*') |
remove_orphan_files |
CALL remove_orphan_files('default.T', '2023-10-31 12:00:00') |
reset_consumer |
CALL sys.reset_consumer('default.T', 'myid', 10) |
rollback_to |
CALL sys.rollback_to('default.T', 10) |
Flink 1.19 将支持 "命名参数"(Named Arguments),这将使其在有多个参数时更易于使用。
Committer Improvement
Committer 负责提交元数据,有时可能会遇到瓶颈,导致反压操作。在 0.6 中,我们进行了以下优化:
- 默认情况下,paimon 会同步删除过期快照。用户可以通过将 snapshot.expire.execution-mode 设置为 async 来使用异步过期模式,以提高性能。
- 可以使用 Flink 的细粒度资源管理(fine-grained-resource-management)功能,只增加 Committer 的堆内存和 CPU。
Primary Key Table
Cross Partition Update
跨分区更新可用于生产!
目前支持 Flink 批量和流式写入,企业已将其应用于生产环境!如何使用跨分区更新:
- 主键不包含所有分区字段。
- 使用动态 Bucket 模式,即 bucket 为-1。
该模式直接维护 Key 到分区和桶的映射,使用本地磁盘,并在开始写任务时通过读取表中的所有现有 Keys 来初始化索引。虽然维护索引是必要的,但这种模式也能保持较高的吞吐量性能。
Read Optimized
对于主键表,这是一种 "MergeOnRead "技术。读取数据时,多层 LSM 数据会被合并,并行数量会受到数据桶数量的限制。如果想在某些情况下快速查询,但只能找到较早的数据,可以从读优化表中查询:SELECT * FROM T$ro。
但这无法保证数据的新鲜度,因此可以在写入数据时配置 "full-compaction.delta-commits",以确保读取的数据具有确定的延迟。
StarRocks 和其他 OLAP 系统将在 Paimon 0.6 的基础上发布一个版本,以大大提高读优化表的查询性能。
Partial-Update
在 0.6 中,你可以为带有 Sequence-Group 的 Partial-Update 合并引擎定义聚合函数。这样就可以在特定条件下对某些字段执行特殊的聚合,如计数、求和等。
Compaction
我们引入了一些异步技术,以进一步提高 Compaction 的性能!20%+
0.6 引入了整库 Compaction 功能,您可以运行命令为多个数据库提交 Compaction 作业。如果提交的是流式作业,作业会持续监控表的新变化,并在需要时执行 Compaction。
Append Table
Append Table 模式生产可用!
通过为非主键表定义 "bucket"="-1",可以为该表分配一种 Append 可扩展模式。这种表是 Hive 格式的升级版。你可以使用它:
1. Spark、Flink 批量读写,包括 INSERT OVERWRITE 支持。
2. Flink、Spark 流读写,Flink 会对小文件进行压缩。
3. 你还可以对该表进行排序(z-order),这将大大加快查询性能,尤其是当存在与排序键相关的过滤条件时。
你可以为 append-only 表设置 write-buffer-for-append 选项,以适用于同时流式写入大量分区的情况。
0.6 还引入了 Hive 表迁移,Apache Hive 支持 ORC、Parquet 文件格式,这些格式可以迁移到 Paimon。当数据迁移到 paimon 表时,原表将永久消失。因此,如果还需要原始表,请备份数据。迁移后的表将成为 Append 表。你可以使用 Flink Spark CALL 存储过程来迁移 Hive 表。
StarRocks 和其他 OLAP 系统将在 Paimon 0.6 的基础上发布一个版本,以大大提高 Append 表的查询性能。
Tag Management
Upsert To Partitioned
Tag 将维护 Snapshot 的 Manifest 和数据文件。离线数据仓库每天都需要一个不可变的视图,以确保计算的幂等性。因此,我们创建了一个 Tag 机制来产生这些视图。
但是,传统的 Hive 数据仓库更习惯于使用分区来指定查询的 Tag,更习惯于使用 Hive 计算引擎。
因此,我们引入了 metastore.tag-to-partition 和 metastore.tag-to-partition.preview,将非分区主键表映射到 Hive 元存储中的分区表,并将分区字段映射为 Tag 的名称,以便与 Hive 完全兼容。
Tag with Flink Savepoint
你无法从很老的 Flink 保存点恢复写作业,这可能会导致 Paimon 表出现问题。在 0.6 中,我们避免了这种情况,即当数据异常时会抛出异常,让作业无法启动。
如果想从老的保存点恢复,建议将 sink.savepoint.auto-tag 设置为 true,以启用自动为 Flink 保存点创建 Tag 的功能,并在重新恢复时 rollback 到此 Tag。
Formats
0.6 将 ORC 版本升级到 1.8.3,Parquet 版本升级到 1.13.1。在此版本中,ORC 原生支持 ZSTD,这是一种压缩率更高的压缩算法。我们建议在需要高压缩率时使用它。
Metrics
在 0.6 中,Paimon 构建了一个 Metrics 系统来衡量读写行为,Paimon 支持内置 Metrics 来衡量提交、扫描、写入和 Plan 等操作,这些 Metrics 可以桥接到 Flink 等计算引擎。对于流式读取来说,最重要的是 currentFetchEventTimeLag。
Paimon Spark
- 支持Spark3.5
- Structured Streaming:支持作为Streaming Source,支持通过自定义read trigger进行源端流量控制,支持流读changelog
- Row level op:DELETE 优化,支持UPDATE、MERGE INTO
- Call Procedure:新增compact、migrate_table、migrate_file、remove_orphan_files、create_tag、delete_tag、rollback
- 查询优化:Push down filter 优化、支持 Push down limit、Runtime filter(DPP)
- 其它:Truncate Table 优化、支持 CTAS、支持 Truncate Partition
Paimon Trino
Paimon Trino 模块主要有以下工作来加速查询:
- 优化转换 Page 的问题,避免 Page 太大导致内存溢出
- 实现了 Limit Pushdown,并且能结合分区的过滤条件
Paimon Presto
Paimon Presto 模块正式进入生产可用,增加了以下的能力:
- 实现了 Filter Pushdown,这让 Paimon Presto 进入正式可用
- 使用 Inject 模式,这可以让 Paimon Catalog 常驻进程中,提高查询的速度
关于 Paimon
- 微信公众号:Apache Paimon ,了解行业实践与最新动态
- 官网:https://paimon.apache.org/ 查询文档和关注项目