ApachePaimon 来源于 Flink Table Store, 其核心是想打造一套适合Flink流水数据处理引擎的流程存储引擎。目前世面上的存储引擎都是针对批的,虽然说流式引擎也能用,但最后一环没打通,这也是影响整个数据处理流程速度的一环。
Flink 社区,参考了Iceberg的一些设计理念,有意打造一个高效的流式数据湖。Apache Paimon 的主要功能是围绕具有 ACID 特性的数据湖存储构建的,并支持 DML 操作。
什么是Paimon?
通过云对象存储构建具有 ACID 特性动态表的统一存储,以支持高速数据读取、跟踪、更改数据、高效的实时分析和及时的数据查询。
在底层,Paimon 将列式文件存储在文件系统/对象存储系统上,并使用 LSM(日志结构化合并)树结构来支持大量数据更新和高性能查询。
其实不论是COW还是MOR的方式,本质上都是延迟Join方式,这里采用LSM使得数据有序,提升Join的性能。
在能力上,它拥有像竞争对手一样的所有通用功能,包括支持更新/删除、时间旅行、一致视图保证、模式演变、仅追加表、可扩展元数据等。
支持不同模式的数据Merge
Deduplicate (删除重复数据)
它是默认的Merge引擎,其中最新的数据记录将被保留,具有相同主键的其他记录将被丢弃。由于这是执行合并操作的常用方式,因此这里不再详细解释。Partial-Update (部分更新)
在某些情况下,生产者无法获得所有列的详细信息。这种情况主要发生在源是列式数据库时,并且由于性能相关或其他问题,所有列的数据不会发送到下游系统。利用“部分更新”合并引擎的功能有助于解决上述情况下的问题。
通过设置merge-engine=partial-update,一条记录的列可以通过多次更新来形成一条完整的记录。对于相同的主键组合:
1)具有非空值的值字段会更新为最新数据;
2)具有空值的值字段不会更新/覆盖。
下面的快照解释了处理大量记录时默认合并引擎和部分更新合并引擎之间的区别:

Aggregation (聚合)
有时,消费者只需要汇总结果。原始原始数据(聚合之前)不需要进行任何进一步处理。在这种情况下,将原始数据保存在单独的表中是多余的,它只会消耗额外的空间,而没有任何实际用途。
通过设置 merge-engine=aggregation 并在列上选择所需的聚合操作,每个具有最新值的值字段将针对相同的主键组合进行一一聚合(使用所选的聚合操作)。支持的聚合函数包括 sum、min、max、last_value、last_non_null_value、listagg、bool_and、bool_or。
例如,需要聚合功能的表的合并引擎需要设置如下:
CREATE TABLE AGG_TABLE (
date DATE,
price BIGINT,
sales BIGINT,
PRIMARY KEY (date) NOT ENFORCED
) WITH (
'merge-engine' = 'aggregation',
'fields.price.aggregate-function' = 'max',
'fields.sales.aggregate-function' = 'sum'
)
以下快照说明了聚合合并引擎在实现和未实现的情况下的行为对比。

如上图所示,通过利用聚合合并引擎提供的功能,可以完全忽略将数据提取到附加表所花费的空间和时间。
总结
不过目前Apache Paimon 正处于孵化阶段,很多功能还不是很完善,未来几个月可能会有许多更改和升级。