001 第一次反思
终于明白了watermark 与 迟到数据的含义了。一直觉得很神秘,加上没有实操过,这里看了很多书都没有搞清楚,今天终于醍醐灌顶。 watermark 什么高级功能都没有,只是用来做标记而已,标记是不是迟到的数据,然后使命就完成了,至于标记出来的数据怎么操作,标记有什么用就不用管了。
既然都标记出来了迟到数据,那么就要对这部分数据进行处理,因为本质上从数据完整性来讲,我们的数据处理程序没处理这段迟到数据是不完整的,数据是错误的。非常极端的例子就是所有的数据都迟到了,这样处理出来的结果肯定是不符合要求的,因此数据处理程序对数据迟到率的高低也是衡量程序好坏的一个重要指标,我们要调整消费快慢,我们要调整watermark 的合理生成时间以更加逼近实时,减少迟到数据的量。
不可能百分之百没有迟到数据,根据业务以及技术成本的考虑对迟到数据有多种处理办法,躺平的处理就是直接丢弃,要是这部分的数据不是很多,不是核心业务数据的话OK。要么是把这些迟到的数据打到另一个地方单独处理,要么是等迟到数据来了后再重新计算一遍。再计算的话成本是比较高的,不知道什么时候能结束,等待的过程中中间数据还是存内存的,比较耗成本。
本章学习了 Flink 的时间与窗口,流数据就是指的无界的数据,这里的无界指的是数据会一直产生,不会停。但是我们又想看看实时的指标,不同的指标有不同的观测方式和口径,比如点击数,曝光数。假设我要看历史以来的点击数的实时累计和,能不能实现?还是能实现,只是成本比较高,要一直存状态数据每天每时每刻都要存状态数据并去更新。这样并没有意义。
要在一定的窗口内实现计算,就一定要设置时间窗口,有时间窗口就一定有迟到数据,有迟到数据就要有watermark 来标记迟到数据,有watermark 就要指定时间语义。另外窗口函数一定是比较细粒度的控制,除了由窗口结束时间触发,还可以有很多业务逻辑的触发,我们可以设置 timer,可以设置阈值。一般别人说的允许延迟xx,多半说的是这里。
join 也是基于时间窗口的,不过说是inner join,看上去好像是 full join 样,,,。
窗口处理函数主要是有两种,一种是增量,一种是全量。、