王大锤

少年,我看你骨骼精奇,是万中无一的武学奇才,维护世界和平就靠你了!

18篇博客

增量抽取的重跑机制

王大锤2020-08-13 14:38

网易有数的抽取是将用户建立的模型的数据从源库转移到网易有数的高性能MPP内,形式上分为全量覆盖抽取,全量追加抽取和增量抽取。

全量覆盖:每次会删除前一个副本,只保留一个副本,并且每次抽取都是全量的

全量追加:不会删除副本,保留所有副本,每次抽取都是全量的

增量抽取:每次抽取都是增量的,需要一个增量键作为增量的标志

————————————————————————————————

这次我们主要来说一下增量抽取的重跑机制:

功能路径:项目中心-->抽取管理-->对应增量抽取-->更多-->重跑



可以看到,重跑分为两种,一种是任务时间,一种是数据范围。为了方便解释,我们设定一种增量抽取场景,我们抽取一张表T,增量键为每天都不一样的DAY字段。今天是2019.3.22,我们发现2019.3.20的数据有了更新,我们需要更新这部分数据,因此需要用到我们的重跑功能,也就是将2019.3.20日的数据重新从数据库抽取到mpp。使用数据范围和任务时间的原理略有不同,用伪代码解释一下。

----------------------------------------------------------------------------------------------------

数据范围:

①删除MPP内的老数据,delete from MPP.T where day between

"2019/03/20 00:00:00" and "2019/03/20 24:00:00" 。

②从源库查找数据,select * from 源库.T where day between "2019/03/20 00:00:00" and "2019/03/20 24:00:00" 

③将查询所得数据插回mpp,即完成数据的重跑更新。

这个过程的关键是利用了增量键【day】直接来判断数据的范围。因此,重跑若要成功,需要保证第②步的时候能够成功的查询到数据。

--------------------------------------------------------------------------------------------------

任务时间:顾名思义,也就是任务执行的时间,实际上mpp将数据抽取入库的时候会为数据打上一个时间戳,也就是任务时间time。如果我们选择了任务时间,mpp的动作不变,但是区别在于把增量键的条件改成了time的条件,伪代码如下

①查询MPP库 ,得到数据的边界 select min(day),max(day) from MPP.T where time  between "2019/03/20 00:00:00" and "2019/03/20 24:00:00"  

②做一个删除的动作 ,delete from  MPP.T where time  between "2019/03/20 00:00:00" and "2019/03/20 24:00:00"   

③查询源库,select * from 源库.T where day between min(day) and max(day)  

④将查询所得的数据插回mpp

这种场景适合用于一天内做了多次增量抽取的情况

---------------------------------------------------------------------------------------------------

这里再介绍一种特殊情况,增量抽取抽的不是一张表而是一条SQL的时候,该如何分析是否可以重跑呢?很简单,把上面所述的{T}表,用你的SQL代替即可,一条自定义SQL实际上是一个视图,视图也可以当成表来看待。

比如,我的SQL写的是  (select  SYSDATE AS DAY, *  from  T ),然后设置day作为增量键,也就是总是以当前时间作为增量。那么这种情况重跑会如何?

答案:很遗憾,这种写法重跑是跑不到数据的,我们可以分析一下

①mpp删除数据

delete from  MPP.(select  SYSDATE AS DAY, *  from  T)  a  where a.day between

"2019/03/20 00:00:00" and "2019/03/20 24:00:00" 

这一步删除了0条数据,因为 day总是等于当前时间,但是执行上是不会报错的,因此系统会继续执行第二步。

②从源库查找数据,select * from 源库.(select  SYSDATE AS DAY, *  from  T) a where a.day between "2019/03/20 00:00:00" and "2019/03/20 24:00:00" 

这一步,检索到0条数据,但是执行上是不会报错的,因此系统会继续执行第三步。

③将查询所得的数据插回mpp

通过分析可以发现,实际上这个重跑相当于啥也没做。