本文为您介绍Paimon的时效性与一致性。
快照文件
快照(snapshot)文件是读取Paimon表数据的入口。消费者可以通过快照文件,查询在该快照文件产生时刻的Paimon表中的具体数据。因此,通过读取不同的快照文件,消费者可以查询Paimon表在不同时间点的状态,在流作业中实现消费位点的修改,以及在批作业中实现time travel功能。
如果您需要查询目前有哪些可用的快照文件,以及每个快照文件创建的时间点,详情请参见Snapshots系统表。
Paimon表的消费依赖快照文件。默认情况下,快照文件的过期时间为1小时。若消费过程中,由于快照过期时间太短或消费作业效率较低等原因,导致消费作业的消费速率跟不上快照文件的过期速度,正在消费的快照文件因过期被删除,则消费作业将会报错。此时请考虑调整快照文件过期时间、指定Consumer ID或Paimon性能优化。
时效性
数据写入Paimon表时,Paimon writer算子会首先将数据缓存在内存以及临时文件中。在Flink作业创建检查点(Checkpoint)后,才会将临时文件进行提交(Commit),并产生快照(Snapshot)文件。下游的流式消费者将监听Paimon表的快照文件列表,发现新的快照文件后,才会读取该快照文件对应的变更数据。
因此,Paimon的时效性受快照文件产生频率的影响,而在Flink作业没有反压的情况下,产生快照文件的时间间隔等同于Flink作业创建检查点的时间间隔(checkpoint interval)。也就是说,Paimon表的时效性等同于Flink作业创建检查点的时间间隔。然而,创建检查点的时间间隔过小,可能会对Flink作业的运行效率产生负面影响。在使用Paimon表时,我们建议将Flink作业创建检查点的时间间隔设置为1分钟至10分钟。且根据业务的接受程度,应尽可能提高这一时间间隔,以进一步提高Paimon表的读写效率。
一致性
Paimon使用两阶段提交协议将数据进行原子化的提交。对于同时写入同一张Paimon表的两个Flink作业:
不修改同一个分桶内的数据时,两个作业中的提交操作可同时进行,并保证sequential级别的一致性。
(不推荐)如果两个作业同时修改同一个分桶内的数据,Paimon将通过作业失败重启(Failover)的方式解决数据冲突,且只能保证Snapshot Isolation级别的一致性。也就是说,Paimon表的最终状态可能是两个作业结果数据的混合,不会有数据丢失。