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增量写入的新数据。