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




Iceberg v2表写入和微批治理冲突,如何保证治理准确性的更多相关文章
- 数据库调优过程(二):找到IO不存在问题,而是sqlserver单表写入IO瓶颈
物理机上测试IO是否为瓶颈: 使用一个死循环insert into测试数据库最大写入速度: use [iTest]; declare @index int; ; begin ; INSERT into ...
- SWUST OJ 1012哈希表(链地址法处理冲突)
哈希表(链地址法处理冲突) 1000(ms) 10000(kb) 2676 / 6911 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法 ...
- 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...
- 微服务---Eureka注册中心(服务治理)
在上一篇的初识SpringCloud微服务中,我们简单讲解到服务的提供者与消费者,当服务多了之后,会存在依赖与管理之间混乱的问题,以及需要对外暴露自己的地址,为了解决此等问题,我们学习Eureka注册 ...
- python操作mysql数据库读取一个数据库的表写入另一个数据库
写这个肯定是工作需要了,不啰嗦,直接说事 我现在有两台主机,一台是公司主机,一台是客户主机,要求把公司主机上的三个表同步到客户主机上的数据库 注意是同步,首先就得考虑用linux定时任务或者主从复制, ...
- 注册表写入自定义协议,网页打开exe
新建文件:Register.reg,写入代码: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\exe1] @="exe1 P ...
- C语言操作注册表 写入 读取信息
#include <stdio.h>#include <windows.h>int main(void){char regname[]="Software\\Micr ...
- [置顶] 【VB.NET2010】注册表写入方法
这里,以添加启动项为例: Imports Microsoft.Win32 Imports System.Reflection.Assembly Private Sub SetAuto_Click( ...
- spring cloud微服务三:Eureka服务治理之注册服务提供者及服务的发现和消费
当服务注册中心成功建立以后,就需要有服务的注册和消费,否则这个服务注册中心就没有了存在的意义,而实际上,一个简单的服务注册也是非常简单的,仅仅需要实现四部曲就好. 首先,还是建立一个基本的spring ...
- 治理Go模块 服务治理 中台业务 Golang的net.Conn接口,double close
小结: 1.中台业务 前台业务 快车.专车.顺风车,在滴滴这些业务线叫做前台服务,他们有一些共同的特性,都有司机信息,订单的状态,收银,账号等等这些业务逻辑,我们会把专门的业务逻辑集合起来,形成专职的 ...
随机推荐
- Java基础总结大纲(一)
1.JVM.JRE.和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性.说明:java是跨平台的而JVM不是跨平台的,正对的不同的语言 ...
- Python之argparse
argparse模块可以轻松编写用户友好的命令行界面.该程序定义了它需要的参数,argparse并将找出如何解析这些参数sys.argv.argparse模块还会自动生成帮助和用法消息,并在用户给出程 ...
- 使用 spring stream 发送消息
为什么使用spring stream ? spring stream 是用来做消息队列发送消息使用的.他隔离了各种消息队列的区别,使用统一的编程模型来发送消息. 目前支持: rabbitmq kafk ...
- TypeScript 笔记(一)
1. TypeScript 的介绍 完整教程TypeScript 入门教程 TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准,由微软开发的自由和开源的编 ...
- canvas(二)直线样式和虚线
1.设置直线线帽的样式 相关语法:ctx.lineCap,通过赋值形式来设置直线线帽的样式,他有以下3个值: 值 说明 butt 默认 round 圆形线帽 square 正方形线帽 <scri ...
- cmd操作license服务
配置客户机的时候,有时候需要自启动相关服务,例如ArcGIS License Manager. 关于启动服务,参考了别人的意见.点击打开链接 最终用了net start 服务名和net sop 服务名 ...
- openEuler欧拉部署gitbook
安装nodejs10 参见<openEuler欧拉安装指定版本的nodejs> 安装Gitbook n 16 # 选择高版本的node npm config set registry ht ...
- R机器学习:特征工程与特征选择的介绍
两个月没更新了,没有其它理由,就是懒惰,间接持续性的懒惰,一直持续了2个月,简直懒惰!!!大家的好多的私信也没回就过期回不了了.请大家批评我!!!. 看了很多高深的算法之后,实在是看不太明白,所以今天 ...
- TS 原理详细解读(7)绑定1-符号
在上一节主要介绍了语法树的解析生成.就好比电脑已经听到了"你真聪明"这句话,现在要让电脑开始思考这句话的含义--是真聪明还是假聪明. 这是一个非常的复杂的过程,接下来将有连续几节内 ...
- 优化大宽表查询性能,揭秘GaussDB(DWS) 谓词列analyze
本文分享自华为云社区<GaussDB(DWS) 谓词列analyze揭秘>,作者:SmithCoder. 1. 前言 适用版本:[9.1.0.100(及以上)] 当前GaussDB(DW ...