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 亿个条目的分区,会额外占用 1 GB 的内存。不活跃的分区不会占用内存空间。
  2. 对于更新频率较低的表,推荐使用动态分桶模式,以显著提高性能。

部分更新(Partial-Update):序列组(Sequence Group)

序列字段可能无法解决部分更新表在多流更新时的无序问题,因为在多流更新时,序列字段可能会被另一个数据流的最新数据覆盖。因此,我们为部分更新表引入了序列组机制。它可以解决以下问题:

  1. 在多个数据流更新期间的无序问题。每个数据流都定义自己的序列组。
  2. 真正的部分更新,而不仅仅是非空值的更新。
  3. 接受删除记录来撤销部分列。

首行合并引擎

通过指定 '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
2
num-sorted-run.stop-trigger = 2147483647
sort-spill-threshold = 10

这个配置在高峰写入期间会生成更多的文件,并在写入低峰期逐渐合并为最佳读取性能。

Avro文件格式

如果希望实现最佳压缩性能,可以考虑使用行存储文件格式 AVRO。

  • 这样做的好处是可以实现较高的写入吞吐量和压缩性能。
  • 其缺点是分析查询速度会变慢,行存储的最大问题在于它没有查询投影功能。例如,如果表有 100 列,但只查询了几列,那么行存储的 IO 就不容忽视。此外,压缩效率会降低,存储成本会增加。
1
2
file.format = avro
metadata.stats-mode = none

如果不想将所有文件修改为 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 发布 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 将长期致力于解决以下问题:

  1. CDC 数据湖化加速:实时写入、实时查询,并通过使用标签实现离线不可变分区视图。
  2. 丰富合并引擎,改进流式计算:Partial-Update 表、Aggregation 表、First Row 表。
  3. Changelog 流式读取,基于湖仓存储构建增量流处理。
  4. Append 模式加速 Hive 离线表,实时写入并在排序后带来查询加速。
  5. Append 模式替代部分消息队列场景,按输入顺序流式读取,无数据 TTL。

原文链接:
https://paimon.apache.org/release-0.5/

(END)