目录
[2.1、append table](#2.1、append table)
3、数据湖功能(类比:hudi、iceberg、delta)
[3.1、支持 ACID 事务](#3.1、支持 ACID 事务)
[3.2、支持 Time travel(时间旅行)](#3.2、支持 Time travel(时间旅行))
[3.3、支持 Schema Evolution(元数据变更)](#3.3、支持 Schema Evolution(元数据变更))
[3.4、可扩展元数据:存储 PB 级大规模数据集和存储大量分区](#3.4、可扩展元数据:存储 PB 级大规模数据集和存储大量分区)
1、实时更新
1.1、实时大批量更新
通过 Flink streaming 可以实现primary key 表的实时大批量更新。
1.2、支持定义合并引擎
用户可以随心所欲地更新记录。复制以保留最后一行,或部分更新,或汇总记录,或第一行,提供了很灵活的处理方式,总之可以用户自己决定。
主键表的数据更新提供了以下合并机制:
|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 合并机制 | 详情 |
| (1)去重(Deduplicate) | 去重机制(deduplicate)是默认的数据合并机制。对于多条具有相同primary key的数据,Paimon结果表仅会保留最新一条数据,并丢弃其它具有primary key的数据。 说明 如果最新一条数据是一条delete消息,所有具有该primary key的数据都将被丢弃。 |
| (2)部分更新(Partial Update) | 通过指定部分更新机制(partial-update),您可以通过多条消息对数据进行逐步更新,并最终得到完整的数据。具体来说,具有相同primary key的新数据将会覆盖原来的数据,但值为null的列不会进行覆盖。 例如,假设Paimon结果表按顺序收到了以下三条数据: * <1, 23.0, 10, NULL> * <1, NULL, NULL, 'This is a book'> * <1, 25.2, NULL, NULL> 第一列是primary key,则最终结果为<1, 25.2, 10, 'This is a book'>。 说明 * 如果需要流读partial-update的结果,必须将changelog-producer
参数设置为lookup或full-compaction。 * partial-update无法处理delete消息。您可以设置partial-update.ignore-delete
参数以忽略delete消息。 |
| (3)预聚合(Aggregation) | 部分场景下,可能只关心聚合后的值。预聚合机制(aggregation)将具有相同primary key的数据根据您指定的聚合函数进行聚合。对于不属于primary key的每一列,都需要通过fields.<field-name>.aggregate-function
指定一个聚合函数,否则该列将默认使用last_non_null_value
聚合函数。例如,考虑以下Paimon表的定义。 sql CREATE TABLE MyTable ( product_id BIGINT, price DOUBLE, sales BIGINT, PRIMARY KEY (product_id) NOT ENFORCED ) WITH ( 'merge-engine' = 'aggregation', 'fields.price.aggregate-function' = 'max', 'fields.sales.aggregate-function' = 'sum' );
price列将会根据max函数进行聚合,而sales列将会根据sum函数进行聚合。给定两条输入数据 <1, 23.0, 15>和 <1, 30.2, 20>,最终结果为<1, 30.2, 35>。当前支持的聚合函数与对应的数据类型如下: * sum:支持DECIMAL、TINYINT、SMALLINT、INTEGER、BIGINT、FLOAT和DOUBLE。 * min和max:支持DECIMAL、TINYINT、SMALLINT、INTEGER、BIGINT、FLOAT、DOUBLE、DATE、TIME、TIMESTAMP和TIMESTAMP_LTZ。 * last_value和last_non_null_value:支持所有数据类型。 * listagg:支持STRING。 * bool_and和bool_or:支持BOOLEAN。 说明 * 只有sum函数支持回撤与删除数据,其它聚合函数不支持回撤与删除。如果您需要某些列忽略回撤与删除消息,可以设置'fields.${field_name}.ignore-retract'='true'
。 * 如果需要流读aggregation的结果,必须将changelog-producer
参数设置为lookup或full-compaction。 |
参数设置如下:
|--------------|-----------------------|--------|--------|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 说明 | 类型 | 必填 | 默认值 | 备注 |
| merge-engine | 相同primary key数据的合并机制。 | String | 否 | deduplicate | 参数取值如下: * deduplicate:仅保留最新一条。 * partial-update:用最新数据中非null的列更新相同primary key的现有数据,其它列保持不变。 * aggregation:通过指定聚合函数进行预聚合。 关于数据合并机制的具体分析,详情请参见数据合并机制。 |
1.3、支持定义更新日志生成器
用户可以在更新中为合并引擎生成正确、完整的更新日志,简化流式分析。
Paimon 每个数据文件包含多行,每行都有一种行类型(用字母表示),该类型将行标记为插入 (+I)、更新 (+U) 或删除 (-D)。更新可以支持变更日志生成器的更新前 (-U) 和更新后 (+U)。
2、海量数据追加处理
2.1、append table
追加表(非 primary key table )提供大规模批处理和流式处理能力,并实现小文件合并。
Paimon 表目前支持的写入模式如下:
|-------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 模式 | 详情 |
| Change-log | change-log写入模式是Paimon表的默认写入模式。该写入模式支持根据primary key对数据进行插入、删除与更新,您也可以在该写入模式下使用上文提到的数据合并机制与增量数据产生机制。 |
| Append-only | append-only写入模式仅支持数据的插入,且不支持primary key。该模式比change-log模式更加高效,可在对数据新鲜度要求一般的场景下(例如分钟级新鲜度)作为消息队列的替代品。 关于append-only写入模式的详细介绍,请参见Apache Paimon官方文档。在使用append-only写入模式时,需要注意以下两点: * 建议您根据实际需求设置bucket-key
参数,否则Paimon表将根据所有列的值进行分桶,计算效率较低。 * append-only 写入模式可在一定程度上保证数据的产出顺序,具体的产出顺序为: 1. 如果两条数据来自不同的分区,若设置了scan.plan-sort-partition
参数,则分区值较小的数据将首先产出。否则来自较早创建的分区的数据将首先产出。 2. 如果两条数据来自同一分区的同一分桶,则较早写入的数据将首先产出。 3. 如果两条数据来自同一分区的不同分桶,由于不同分桶由不同的并发进行处理,因此不保证两条数据的产出顺序。 |
2.2、快速查询
支持数据压缩,使用 Z 排序优化文件布局,使用最小最大等索引提供基于数据跳转的快速查询。
Z-order 基本介绍:Z-Order 是一种可以将多维数据压缩到一维的技术,在时空索引以及图像方面使用较广。Z曲线可以以一条无限长的一维曲线填充任意维度的空间,对于数据库的一条数据来说,我们可以将其多个要排序的字段看作是数据的多个维度,z曲线可以通过一定的规则将多维数据映射到一维数据上,构建 z-value 进而可以基于该一维数据进行排序。
3、数据湖功能(类比:hudi、iceberg、delta)
3.1、支持 ACID 事务
Paimon 通过提供 ACID(原子性、一致性、隔离性、持久性)事务,确保数据的一致性和可靠性,这对于在复杂数据处理流水线中维护数据完整性至关重要。
3.2、支持 Time travel(时间旅行)
当用户在查询数据的时候, 若要从之前的某一个时间点开始查询数据, 即任务启动时想要查一些历史数据, 则需用时间旅行这个特性。用户可通过 scan.mode 参数设置Paimon源表的消费位点。scan.mode 参数的可选值以及行为如下:
|--------------------|-------------------------------------------------------------------|-----------------------------------------------------------------------------------------|
| 参数值 | 批读行为 | 流读行为 |
| default | 默认值,根据其他参数确定实际的行为。 * 如果设置了scan.timestamp-millis
,则行为与from-timestamp参数值相同。 * 如果设置了scan.snapshot-id
,则行为与from-snapshot参数值相同; 如果以上两个参数都没有设置,则行为与latest-full参数值相同。 ||
| latest-full | 读产出表的最新 snapshot。 | 作业启动时,读首先产出表的最新snapshot,之后持续产出增量数据。 |
| compacted-full | 只读取产出表最近一次 compact后的snapshot。 | 作业启动时,首先产出表最近一次compact后的snapshot,之后持续产出增量数据。 |
| latest | 与latest-full相同。 | 只读取最新的变更数据 |
| from-timestamp | 只读取指定时间戳(含该时间戳)的快照中的所有数据。 | 作业启动时不产出snapshot,之后持续产出从scan.timestamp-millis
开始(含)的增量数据。 |
| from-snapshot | 产出表的snapshot,snapshot编号由scan.snapshot-id
指定。即只读取指定 id 的快照中的所有数据。 | 作业启动时不产出snapshot,之后持续产出从scan.snapshot-id
开始(含)的增量数据。即从指定 id 的快照开始读取变更数据(包含后续新增) |
| from-snapshot-full | 与from-snapshot相同。 | 作业启动时产出表的snapshot,snapshot编号由scan.snapshot-id
指定,之后持续产出从scan.snapshot-id
开始(不含)的增量数据。 |
3.3、支持 Schema Evolution(元数据变更)
即源端增加列、不用重启 Flink 作业、可以自动识别实时导入到 Paimon 表。目前,Paimon支持的 CDC 形式包括:Mysql、Postgres、Kafka、Mongo、Pulsar。
3.4、可扩展元数据:存储 PB 级大规模数据集和存储大量分区
Apache Paimon 元数据可扩展主要指的是其在元数据管理上的扩展能力和灵活性。具体包括以下方面:
3.4.1、表级别的元数据管理
- 多表支持:Paimon能够同时管理大量表的元数据,且性能随表的数量扩展良好。
- 动态分区管理:支持大规模分区动态加载和裁剪,适合高并发场景和海量分区表。
3.4.2、架构可扩展性
- 元数据分布式存储:Paimon的元数据可以存储在分布式存储(如 HDFS、S3)或集中式系统(如 Hive Metastore)中,能够支持大规模的元数据查询和更新。
- 元数据分片和分区:通过分布式存储或缓存优化元数据访问,提升查询效率,减少热点问题。
3.4.3、自定义扩展
- Schema 演进:支持字段的添加、修改、删除等操作,而无需重新生成全量数据表。
- 自定义元数据:支持用户根据需求自定义元数据字段,如表注释、存储策略、访问权限等。
3.4.4、版本管理和一致性
- 多版本管理:Paimon对表的元数据支持多版本管理,可以随时回滚或查询历史元数据。
- 事务支持:确保元数据更新的一致性和隔离性(ACID),即便在高并发操作下也能保证正确性。
3.4.5、与其他系统的兼容性
- 与 Hive Metastore 的集成:通过标准接口与现有大数据生态兼容(如 Hive、Spark、Flink 等)。
- 统一视图:Paimon中的元数据能够被多个计算引擎同时使用,实现数据湖与数据仓的统一。
3.5、分区过期设置
Paimon表支持自动删除存活时长大于分区过期时长的分区的功能,以节省存储成本。详情如下:
-
存活时长:当前系统时间减去分区值转化后的时间戳。分区值转化后的时间戳是按照以下顺序转化而得:
-
通过格式串
partition.timestamp-pattern
参数,将一个分区值转换为时间字符串。在该格式串中,分区列由美元符号()加上列名表示。例如,假设分区列由year、month、day、hour四列组成,格式串`year-month-day $hour:00:00
会将分区
year=2023,month=04,day=21,hour=17转换为字符串
2023-04-21 17:00:00`。 -
通过格式串
partition.timestamp-formatter
参数,将时间字符串转换为时间戳。如果该参数没有设置,将默认尝试
yyyy-MM-dd HH:mm:ss
与yyyy-MM-dd
两个格式串。任何Java的DateTimeFormatter兼容的格式串都可以使用。
-
-
分区过期时间:您设置的
partition.expiration-time
参数值。
4、参考
Paimon连接器_实时计算 Flink版(Flink)-阿里云帮助中心
Understanding Apache Paimon's Consistency Model Part 1 --- Jack Vanlightly