Apache Paimon 0.5正式发布
Apache Paimon 0.5.0-incubating 版本终于在今天正式发布了。有近 100 位贡献者参与了此版本的开发,共完成了 500 多次代码提交,为社区带来了许多令人兴奋的新功能和改进。
该版本的主要亮点功能如下:
- CDC 数据入湖的功能已经成熟。
- 引入了标签的概念,为离线数据仓库提供不可变视图。
- 主键表的动态桶模式已投入生产。
- 引入仅追加模式可扩展表,以取代 Hive 表。
CDC摄入
Paimon 支持多种方式将数据导入 Paimon 表,并支持模式演化。在 0.5 版本中,新增了许多新功能,包括:
MySQL 数据表同步
- 支持将分片数据同步到一个 Paimon 表中。
- 支持将所有字段类型映射为字符串。
MySQL 数据库同步
- 支持合并多个数据库中的多个分片数据。
- 支持
--mode combined
模式,将所有表整合到一个统一的数据汇中进行同步,并支持在不重启作业的情况下同步新增的表。
从 Kafka 同步数据表
- 将 Kafka 主题里的数据表同步到 Paimon 表中。
- 支持 Canal 和 OGG 格式。
从 Kafka 同步数据库
- 将包含多张数据表的一个 Kafka 主题或各包含一张表的多个主题同步到一个 Paimon 数据库中。
- 支持 Canal 和 OGG 格式。
MongoDB 集合同步
- 将 MongoDB 中的一个集合同步到一个 Paimon 表中。
MongoDB 数据库同步
- 将整个 MongoDB 数据库同步到一个 Paimon 数据库中。
主键表
通过在创建表时的 DDL 中指定主键,就可以得到一张主键表(Primary Key Table),它可以接受插入、更新或删除记录操作。
动态分桶(Dynamic Bucket)
通过配置 'bucket' = '-1'
,Paimon 可以动态维护索引,自动扩展桶的数量。
- 选项 1:
'dynamic-bucket.target-row-num'
:控制一个桶的目标行数。 - 选项 2:
'dynamic-bucket.assigner-parallelism'
:分配器操作符的并行度,控制初始化桶的数量。
动态分桶模式使用哈希索引来维护从键到桶的映射关系,相比固定桶模式,它需要更多的内存。为了提高性能:
- 一般来说,不会有性能损失,但会额外消耗一些内存。例如,对于一个包含 1 亿个条目的分区,会额外占用 1 GB 的内存。不活跃的分区不会占用内存空间。
- 对于更新频率较低的表,推荐使用动态分桶模式,以显著提高性能。
部分更新(Partial-Update):序列组(Sequence Group)
序列字段可能无法解决部分更新表在多流更新时的无序问题,因为在多流更新时,序列字段可能会被另一个数据流的最新数据覆盖。因此,我们为部分更新表引入了序列组机制。它可以解决以下问题:
- 在多个数据流更新期间的无序问题。每个数据流都定义自己的序列组。
- 真正的部分更新,而不仅仅是非空值的更新。
- 接受删除记录来撤销部分列。
首行合并引擎
通过指定 'merge-engine' = 'first-row'
,用户可以保留相同主键的第一行数据。与 deduplicate
合并引擎不同,在 first-row
合并引擎中,只会生成插入类型的更改日志。
这对于在流计算中替换日志去重非常有帮助。
Lookup Changelog-Producer
Lookup Changelog-Producer 在生产环境中可用,这可以大大减少需要生成更改日志的表的延迟。
(注意:请增加 'execution.checkpointing.max-concurrent-checkpoints'
的 Flink 配置,这对性能非常重要)。
序列自动填充
当记录被更新或删除时,sequence.field
必须变大,不能保持不变。对于 -U
和 +U
操作,它们的序列字段必须不同。如果无法满足此要求,Paimon 可以提供自动填充序列字段的选项。
配置 'sequence.auto-padding' = 'row-kind-flag'
:如果对 -U 和 +U 使用相同的值,就像 Mysql Binlog 中的 “op_ts”(在数据库中进行更改的时间)一样,建议使用自动填充行类型标志,它会自动区分 -U (-D) 和 +U (+I)。
异步压缩
压缩本质上是异步进行的,但如果你希望它完全异步且不阻塞写入操作,并期望以最大写入吞吐量模式运行,可以慢慢地进行压缩而不急于处理。你可以为表使用以下策略:
1 | num-sorted-run.stop-trigger = 2147483647 |
这个配置在高峰写入期间会生成更多的文件,并在写入低峰期逐渐合并为最佳读取性能。
Avro文件格式
如果希望实现最佳压缩性能,可以考虑使用行存储文件格式 AVRO。
- 这样做的好处是可以实现较高的写入吞吐量和压缩性能。
- 其缺点是分析查询速度会变慢,行存储的最大问题在于它没有查询投影功能。例如,如果表有 100 列,但只查询了几列,那么行存储的 IO 就不容忽视。此外,压缩效率会降低,存储成本会增加。
1 | file.format = avro |
如果不想将所有文件修改为 Avro 格式,至少可以考虑将前几层的文件修改为 Avro 格式。可以使用 'file.format.per.level' = '0:avro,1:avro'
来指定前两层的文件使用 Avro 格式。
仅追加表
仅追加可扩展表
通过对非主键表定义 'bucket'='-1'
,可以将其指定为“仅追加可扩展表”。在这种模式下,表不再有 bucket 的概念,读写是并发的。我们将此表视为批量离线表(尽管我们仍然可以流式读写)。
使用这种模式,你可以将 Hive 表替换为湖表。
默认情况下,该模式开启了小文件自动合并功能。也可以使用 Sort Compact
操作对整个分区进行排序,使用 zorder 排序器,这可以大大加快查询时跳过数据的速度。
标签管理
Paimon 的快照为查询历史数据提供了一种简便的方法。但在大多数情况下,作业会产生过多的快照,表会根据表的配置使旧快照过期。快照过期也会删除旧的数据文件,过期快照中的历史数据将无法再查询。
要解决这个问题,可以根据快照创建一个标签。标签会维护快照的清单和数据文件。典型的用法是每天创建一个标签,然后就可以维护每天的历史数据,以便批量读取。
Paimon 支持在写作业中自动创建标签。可以使用 'tag.automatic-creation'
来自动创建标签。
而且还可以查询标签(或快照)的增量数据,Flink 和 Spark 都支持增量查询。
引擎
Flink
Flink 发布 1.17 版后,Paimon 进行了非常深入的集成。
- ALTER TABLE 语法通过增加 ADD/MODIFY/DROP 列的功能得到了增强,使用户更容易维护其表模式。
- 您需要使用 Hive 元存储。然后,您就可以使用 Paimon、Hive 和 Flink 通用表(Kafka 和其他表)中的所有表!
- 在使用 FlinkGenericCatalog 时,需要使用 Hive 元存储(metastore)。这样就可以使用 Paimon、Hive 和 Flink Generic Table(Kafka 和其他表)中的所有表!
- 动态分区覆盖,Flink 的默认覆盖模式是动态分区覆盖(这意味着 Paimon 只删除覆盖数据中出现的分区)。可以通过配置 dynamic-partition-overwrite 将其改为静态覆盖。
- 将分区同步到 Hive 元存储,在默认情况下,Paimon 不会将新创建的分区同步到 Hive 元存储中。如果想在 Hive 中看到分区表,并将新创建的分区同步到 Hive 元存储中,请将表属性 metastore.partitioned-table 设置为 true。
- 重试 Lookup Join,支持重试 Lookup Join 和异步 Lookup Join。
Spark
Spark 是 Paimon 第二大深度集成的计算引擎,在 Paimon 0.5 版本中引入了多种写特性。
- 支持 INSERT OVERWRITE 分区覆盖,Spark 的默认覆盖模式是静态分区覆盖,也可以启用动态覆盖。
- 支持分区管理:支持 DROP PARTITION、SHOW PARTITIONS。
- 支持将 DataFrame 保存到 Paimon 位置。
- 模式合并写入:可以将 write.merge-schema 设置为 true,以便使用模式合并功能进行写入。
- 流式 sink:可以使用 Spark streaming 的 foreachBatch API 将数据流式写入 Paimon。
下载
接下来
Paimon 将长期致力于解决以下问题:
- CDC 数据湖化加速:实时写入、实时查询,并通过使用标签实现离线不可变分区视图。
- 丰富合并引擎,改进流式计算:Partial-Update 表、Aggregation 表、First Row 表。
- Changelog 流式读取,基于湖仓存储构建增量流处理。
- Append 模式加速 Hive 离线表,实时写入并在排序后带来查询加速。
- Append 模式替代部分消息队列场景,按输入顺序流式读取,无数据 TTL。
原文链接:
https://paimon.apache.org/release-0.5/
(END)