如何正确的做增量加工

回到十多年前,增量加工这个方法并不是一种需要特别需要提出的方法,因为关系数据库的存储与计算性能十分有限(即便是MPP数据库平台也不是全都是做全量加工),增量加工是最普遍的方式。

数据库系统是支持事务的,ACID(原子性、一致性、隔离性、持久性)四大特性可以完美的支持在一个数据表上同时做更新、删除、插入操作。数据库系统的数据存储是到每一个4K或者8K这种大小的数据块上的,详细的统计信息与索引结构都允许我们高效来做增量数据处理。

1.1.问题简述

在当前的MaxCompute这种分布式文件系统上,这些操作都变得不容易了。我们的数据块已经是64MB,不是KB这个量级。我们也没有索引这种加速从一千万数据中找到五十行数据的结构。

那么我们怎么在MaxCompute做增量加工呢?说实话,不太好做。因为没有索引结构,我们每一次的处理都是全量数据检索。如果还是跟之前在关系数据库一样频繁的提交,不但无法体现增量加工的性能与资源优势,反而成为了劣势。(如果我们还想使用关系数据库支持的delete、update这些特性,可以看下MaxCompute公共云近期上线的新特性“Transactional表”。)

那么我们要不要做呢?总结一句话:能做的地方还是可以做一下,但是不要勉强,不要大规模的去做,毕竟做增量加工不容易。

增量加工的前提是我们获取到了增量数据,相比全量数据增量数据是一个更小的集合,然后我们希望利用这个小增量集合来完成数据加工的过程而不是使用全量,这样就可以更快速、更节约的完成整个数据加工过程。

但是增量加工在MaxCompute总结为两个场景:

场景一,全量加工所需资源无法满足时效性要求,性能急需优化;

场景二,增量加工逻辑简单,相比全量加工性能优势明显;

2.1.加工原则

然后我们需要确立一些使用增量加工的原则,突破或者不遵守这些原则都是不合理或者不正确的。

二、2张增量表不能直接关联,必须要有至少一张表是全量;

四、多个表关联情况下,需要取多个表的增量标识,只要某一个表的关联行是增量就使用该表增量标识;

五、只有主表或则INNERJOIN的表的INSERT和DELETE状态可以传递到下一层,其他表的增量状态都是UPDATE;

2.2.MERGE逻辑

增量集成到MaxCompute平台的数据落地后,需要做一次MERGE才会产生ODS层的全量数据。所以,MERGE逻辑是最简单和经典的增量加工逻辑。最简单的MERGE逻辑如下:

INSERTOVERWRITETABLEtable_oldPARTITION(ds='${ds}')

SELECT`(ds)+.+`

FROMtable_olda--全量表

LEFTANTIJOIN

table_newb--增量表

ONa.pk=b.pk

ANDb.ds='${ds}'

WHEREa.ds='${lastdate}'

UNIONALL

SELECTb.*

FROMtable_newb

WHEREb.ds='${ds}'

--ANDb.operationnotin('D')

;

这个逻辑使用了一个JOIN加上一个UNION实现了一个MERGE逻辑,把增量合并成一份全量。这里有一个选项【--ANDb.operationnotin('D')】,是否要把物理删除从当前全量表中删除,可以根据实际业务需求选择。

2.3.

业务计算逻辑

MERGE逻辑是最简单的一个涉及到增量的逻辑,但是实际业务计算逻辑要比这个场景更加复杂一些。

2.3.1.2张增量表的处理

我们在MERGE里面虽然也是2张表,但是其实这是一张表的增量与全量。如果是2张增量表,那么该如何处理呢。基于两张增量表无法关联的原则,我们必须引入全量表。

1.我们需要利用2张表的当日增量与全量,也就是说有4张表参与计算。

2.如果不想让全量直接关联,那么就需要先找到两个增量表的主键的并集。然后从两个表的全量中拆出这个并集的集合,再去关联。

逻辑如下:

--ta_addta表的增量表

--ta_allta表的全量表

--tb_addtb表的增量表

--tb_alltb表的全量表

--注意这个场景使用了mapjoin,增量表的数据量是有限制的

withtx_addas(

selectdistinctpkfrom(

selectpkfromta_addwhereds='${ds}'

unionall

selectpkfromtb_addwhereds='${ds}')t)

,ta_add2(

select/*+mapjoin(t2)*/t1.*

fromta_allt1jointx_addt2ont1.pk=t2.pk

wheret1.ds='${ds}'

,tb_add2(

fromtb_allt1jointx_addt2ont1.pk=t2.pk

insertoverwritetabletc_addpartition(ds='${ds}')

select*

fromta_add2t1jointb_add2t2ont1.pk=t2.pk

这个逻辑利用了增量表比较小,可以利用了MAPJOIN的特性,可以快速的产出两个可以关联的并集再去关联。因为避免了大表的重分布,所以,可以大幅提升运行效率,降低资源消耗。(在这里增量的意义是表真的很大,如果全量是两张百万级的表,建议测试一下性能,可能直接关联更简单效率更高。所以,在MaxCompute做增量加工计算很多场景是没必要的。)

2.3.2.2张以上增量表的处理

我们一般说的增量加工的表还是指业务表,而不是代码表、参数表这种小表。这种万级的小表,增量与全量关联计算的性能差距可以忽略。百万级这种量级的表,增量计算也是意义不大的。我们看下上一小节那段冗长的逻辑,其实原本只需要2行就可以,现在已经变得如此的复杂。2张以上的表,如果使用同一PK关联,2张以上表的这个逻辑还是可以沿用的。如果有多个不同的关联PK,这个问题就从一维搞成了二维,除非实在不得已,不建议再去搞增量加工了。

我在这个优化工作的过程中遇到的场景,就是远远大于2张以上的表的增量加工,并且关联的PK也是多个。原来开发者选取了主表作为增量表,其他的表都是全量表的计算逻辑。因为这是一个分钟级的任务,原来的开发者应该还是希望从性能的角度做一些高效的设计。

索性,我就直接改为全量加工了,这样就没问题了。但是这样就无法识别出哪些数据是加工都的增量了,这就涉及到下面要提到的增量推送的问题。

2.4.增量推送逻辑

有两种思路可以获取需要推送的增量,一种是从原始增量开始就一直保留增量标志字段,另一种是从最终结果中利用T和T+1两个全量比对出增量。在上面提到的场景,我们就遇到了第一个场景,我们需要在加工环节保持增量识别标志,并对这个字段在关联后的结果进行计算。

2.4.1.增量标志计算

所以,我们在这里使用的逻辑如下:

select...

,casewhena.etl_partition='${ds}'thena.etl_partition

whenb.etl_partition='${ds}'thenb.etl_partition

...

elsea.etl_partitionendasetl_date

,casewhena.etl_partition='${ds}'thena.operation

whenb.etl_partition='${ds}'then'U'

elsea.operationendasoperation

fromtableaa

leftjointablebona.pk=b.pk

where...;

所以这种方式是可以把增量状态保持下去的,但是因为这个计算后的结果其实一次次的叠加后,可能就不知道对不对了。所以,在具体的业务场景还要具体的去看。

2.4.2.全字段比对

全字段比对是一种暴力的计算方法,不需要增量加工,我也可以计算出增量。并且这种计算结果还是真实可靠的,相对于一个经过多层计算后的业务结果表来说,更是如此。

全字段比对逻辑如下:

一、T+1日表比T日表多的记录,INSERT状态;

二、T日表比T+1日表多的记录,DELETE状态;

三、T+1日表比T日表,关联后相同主键的非主键字段值不一致的,UPDATE状态;

这个比对十分消耗计算资源,尤其是一些最细业务粒度的交易表、事件表。但是对一些用户表这种表来说,问题倒是不大。比对逻辑如下:

--I

selecta.*,'I'asoperation

fromtable1a

leftjointable1bona.pk=b.pkandb.ds='${lastdate}'

wherea.ds='${ds}'

andb.pkisnull

--D

selecta.*,'D'asoperation

leftjointable1bona.pk=b.pkandb.ds='${ds}'

wherea.ds='${lastdate}'

--U

selecta.*,'U'asoperation

jointable1bona.pk=b.pkandb.ds='${ds}'

and(coalesce(b.col,'')<>coalesce(b.col,'')--字符

orcoalesce(b.col,0)<>coalesce(b.col,0)--数值

orcoalesce(b.col,'0001-01-01')<>coalesce(b.col,'0001-01-01'))--日期

全字段比对看起来其实并不优美,实在是有点粗暴。当然你也许会有更容易识别增量的方式,可以多试试,这将是你保底的方法。

通过上面的内容,我们对增量加工的方法有了一定了解。希望我文中提到的方法能帮助大家在日后在项目中正确的使用增量加工的方法,并通过这个方法在部分场景获得显著的性能改进。另外我还是要提到一点,就是增量加工逻辑比全量加工更加复杂,并且还会遇到更为复杂的异常排查、补数据等维护等问题。大家在实际项目中,一定要权衡好利弊,再定夺方案。

THE END
1.Bi的ETL中怎么做增量处理如何在etl中,做增量处理Bi的ETL中怎么做增量处理 增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据。在ETL使用过程中。增量抽取较全量抽取应用更广。如何捕获变化的数据是增量抽取的关键。对捕获方法一般有两点要求:准确性,能够将业务系统中的变化数据按一定的频率准确地捕获到;性能,不能对业务系统造成太大的https://blog.csdn.net/hzp666/article/details/70139867
2.数据仓库中如何做增量处理数据量大,只需要增量最新被更改的数据。 如何做增量 (1)insert into 比如行为数据,发生一条记录就插入一条,数据不会被update。 严格T+1,初始化时候限定created_at的时间。否则凌晨之后的数据会被重复插入。 (2)insert overwrite 初始化的时候不限定时间。 https://www.jianshu.com/p/ed3f698c819d
3.在“确定性”上做增量——“走在前开新局”评论员观察①在“确定性”上做增量,说到底是要提振信心、稳定预期。面对未知风险,企业敢不敢干,敢不敢闯,敢不敢投,既有对市场发展前景的考量,也有对稳定发展环境的评估。近年来,宁德时代、北汽整车、比亚迪等一批支撑性强、带动力大的大项目、好项目,相继在山东投资布局,看中的正是山东稳定、透明、可预期的市场环境和产业生https://m.jnnews.tv/guanzhu/p/2022-08/15/913861.html
4.必须统筹好做优增量和盘活存量的关系增量盘活存量存量“必须统筹好做优增量和盘活存量的关系”,是日前中央经济工作会议提出的五个“必须统筹”之一,是做好经济工作的重要规律性认识,是对未来发展的启示引领,必须深刻把握,学习好、领会好、运用好。 存量,是指某一时点上的总量或积累量。增量,是指某一时期内新增的数量或增长的速度。两者互为条件、相互转化、相互促进http://k.sina.com.cn/article_3167104922_bcc62f9a02001kcrc.html
5.MySQL定时备份(全量备份+增量备份)51CTO博客所以要对线上的数据库定时做全量备份和增量备份。 增量备份的优点是没有重复数据,备份量不大,时间短。但缺点也很明显,需要建立在上次完全备份及完全备份之后所有的增量才能恢复。 MySQL没有提供直接的增量备份方法,但是可以通过mysql二进制日志间接实现增量备份。二进制日志对备份的意义如下: http://bjiokn.blog.51cto.com/1021758/2491656
6.赋能小微商家,打造金融科技综合解决方案少做存量工作,多做增量工作 回顾行业过往,Rick提到从劳资科到人力资源,这个企业部门经历了从提供最基本资源,到驱动业务、驱动组织的职能转变,HR已经站在了业务最前沿,而不再只是支撑型的角色。 Rick坦言,“我感觉HR的工作非常适合我,到现在我仍然很享受这份职业。”他认为,HR对企业来说是一个非常重要的角色,对创业https://www.ersoft.cn/news.html?id=160
7.双赢思维。c.去做增量 博弈除了双赢,就是“零和”,我们都在有限的资源中瓜分,如果能延伸到增量,也会产生共赢的状态。 最简单的现象就是“加工资”,如果有员工给你提出加工资,但是以他的情况,现在打破这个规矩对其他成员不太公平,但是如果不加,这个员工可能离职,怎么办? https://www.niaogebiji.com/article-59062-1.html
8.陕北矿业:做优存量,做大增量,做强变量3月9日,陕煤集团宣布了关于陕北矿业及其所属大型主力煤矿管理体制调整的决定。面对陕煤集团陕北片区体制调整,陕北矿业如何用三至五年时间,做优存量、做大增量、做强变量,再造一个新陕北矿业?这是各级组织和干部职工首要思考、落实、完成的工作任务。 做优存量,现有实体加快发展 https://kyjapi.zgkyb.com/m/article/2580
9.宁夏落实应届大中专毕业生就业政策助学子圆梦——中国青年网政府做增量 “与大省份相比,我们的就业规模较小,但安置就业的难度却不小。”宁夏回族自治区人社厅就业促进与失业保险处处长李海说。 抓就业,首先是政策先行。李海告诉记者,前几年自治区出台了《关于做好当前和今后一段时期就业创业工作的实施意见》《关于吸引支持大学生在宁创新创业就业办法》,其中包括“稳就业13条https://t.m.youth.cn/transfer/index/url/qnsx.youth.cn/jjdt/202211/t20221121_14144518.htm
10.数据库VS数据仓库所以在做增量操作的时候,一定和开发说好这两个字段的定义和使用场景。 is_delete & is_valid 有些场景下,我们需要删除某些数据,一般不会物理删除,会通过一个字段来做逻辑删除,请和开发同学沟通好,使用固定的一个字段,并确认该字段双方的理解是一致的,不然后面又很多坑。 http://www.360doc.com/content/21/0416/05/5315_972549768.shtml
11.乡村振兴“浙盘棋”:“消薄+”加出了什么做增量与去存量 2018年,杭州全市309个集体经济总收入市定薄弱村和258个经营性集体经济薄弱村全部摘帽。如此多的薄弱村是如何全部摘帽的呢? 在2016年3月启动的新一轮“百千万”蹲点调研活动中,杭州100多家市直单位和企业,根据薄弱村的实际情况,为各村量身制定了“一村一策”的具体方案。在此后的实践中,杭州探索http://www.juece.net.cn/tmp/4g/read.html?id=3460
12.DRGDIPAPG究竟是增量改革,还是存量改革?DRG变量DRG改革要想能够胜利,主要的核心问题不是医保本身,根源在于经济,要能提供做增量改革的经济支持,要做增量改革,释放活力;反之如果经济衰落,做的是存量改革,这场改革的漏洞将会被放大无数倍,本就不太宽敞的房子里要来一次外科手术,那么结果很可能是产生一个处处漏风的陋室。 https://www.shangyexinzhi.com/article/12374213.html
13.先全量迁移后增量迁移,数据是否会不一致数据会不一致,迁移任务单独做增量数据迁移时,增量迁移开始同步的增量数据为启动任务的时间。所以在增量迁移任务启动之前,源数据库产生的增量数据都不会被同步到目标实例。如果需要进行不停机迁移,建议配置任务时,迁移类型选择结构迁移、全量数据迁移及增量数据迁移。 上一篇:DTS是否能支持两个不同阿里云账号下的RDS实例之https://help.aliyun.com/document_detail/43531.html