Iceberg v2表写入和微批治理冲突,如何保证治理准确性

一、背景

微批治理任务分多个job治理一张表,还有一个Flink程序每5分钟一次写入iceberg表,如治理任务划分了20个job治理一张表,在治理期间存在新的数据更新,如何保证治理准确性

 

二、治理时写入,快照对应信息

1、治理和写入时快照和文件变化

snapshot_id sequence number manifest_file 文件类型 备注
1
1
file_1
新增 数据(id=5,值=123)
2 1 file_1 旧文件 数据(id=5,值=123)
2 2 file_2 新增 新增数据(id=6)
2 2 file_3 新增 新增数据(id=7)

3(未运行的微批治理,job2)

2 file_3
旧文件
数据(id=7)

3(微批治理任务,job1)

3 file_4(合并file_1、 file_2)
新增
新增数据文件(id=5,值=123)(id=6)
分多个job治理一张表,如分两个job治理一张表。此快照为治理job1生成
4 2 file_3

旧文件

数据(id=7)

4 3 file_4 旧文件 数据(id=5,值=123)(id=6)
4
4
file_5
新增 新增数据文件(id=5,值=456)
4
4
delete_file_1
新增 新增删除文件(id=5)
5
3
file_4
旧文件 数据(id=5,值=123)(id=6)
5
4
file_5
旧文件 数据(id=5,值=456)
5
4
delete_file_1
旧文件 删除文件(id=5)
5(微批治理任务,job2发现有更新,重试)
5
file_6(合并file_3)

新增

提交时判断在本次治理期间有数据写入,在commit时重新拿最新快照信息,使用治理前的sequence number,然后合并后提交新快照,不会覆盖flink更新的数据。

如果微批治理期间有数据更新,则从更新之后的治理job开始,数据文件不会在合并,但是删除文件会做合并,如果历史删除文件较多,后面的治理任务会把删除文件合并。直到下次治理时小的数据文件才可以合并

 
 
 
   
 
 
 
   

 

腾讯云技术小姐姐解答

微批写入时分多个job(如10个)治理一张表,在运行5个 job后有一个实时任务更新了数据,从第6个job开始会有重试。

(1)重试的机制是什么样的

重试时会refresh获取当前最新元数据metadata,在这个基础上把新的元数据manifest files等元数据整合,然后commit

(2)如何保证更新的数据不被旧数据覆盖

如何保证增量写入的更新的数据不被微批治理的旧数据覆盖: use-starting-sequence-number=true, 默认,会使得微批治理会使用治理前本身的sequence number,从而不会覆盖flink增量写入的新数据。

 

posted @ 2024-07-17 09:23  黑水滴  阅读(7)  评论(0编辑  收藏  举报