这是我参加「第四届青训营 」笔记创作活动的第5天。
在之前的笔记中,已对流核算基础、rpc、thrift、Flink 等做了介绍。俗话说温故而知新,今天在学习了DataFlow 论文研读后,又温习了前期的课程内容,在收拾笔记的进程中又有了许多新的收获,为项目开发完成提供了参考。
事情时刻和处理时刻
流核算进程中,数据源源不断到来,尽管咱们希望数据总是能被实时地处理,但是数据却不可避免受到传输进程中的各种因素导致推迟。
下面引出了两种时刻的概念:
- 事情时刻(event time):事情实在发生、数据产生的时刻
- 处理时刻(process time):数据被处理的时刻
能够看到处理时刻一般晚于事情时刻。ideal 的情况下,距离越小越好。
Watermark(水位线)
由于数据可能乱序和迟到,咱们在处理数据的进程中就需求界说一个时刻衡量,用于判断当时event time的时刻。
Watermark,界说为当时体系以为的事情发生地点的实在时刻。它能够由当时体系能看到的数据的事情时刻核算而来,如减去一个固定的delay,来表示能够容忍多长时刻的乱序。
当watermark 更新到某个时刻值时,咱们能够以为所有时刻戳小于watermark的数据都已经抵达了。
关于再来的迟到数据,将会另做处理,如输出到别的的数据管道或直接丢掉。
传递watermark:根据上游的最小值核算自己的 watermark,然后给下流传递。
Window(窗口)
为啥需求window:关于流核算中的无限数据集,对数据做有限块的切割以后续进行处理。关于聚合类操作比较有用,例如:统计在曩昔的1分钟内有多少用户点击了网页。
window 机制是 Streaming 到 Batch 的一个桥梁。
窗口类型
三种根本类型:翻滚窗口,滑动窗口,会话窗口
- 翻滚窗口:创立时指定窗口巨细(时刻跨度固定)。窗口之间的数据没有堆叠。
- 滑动窗口。创立时指定窗口巨细和滑动周期。窗口之间的数据能够堆叠。翻滚窗口能够视为滑动周期与窗口巨细相等的滑动窗口。
- 会话窗口。创立时指定超时时刻。假如新输入数据的事情时刻与从前数据的事情时刻相比超越了超时时刻,则新输入数据属于新的会话窗口;假如没有超越超时时刻,则它构成的窗口与从前的窗口兼并。是一个动态 merge的进程,与事务结合的比较紧密。
窗口触发器
触发器(Trigger)决定了一个窗口何时能够被核算或铲除。
触发战略有多种选择,如“当窗口中的元素数量大于4”时,或“当水位线跳过窗口完毕时”等。
现有的核算结构采用了Watermark作为窗口核算的触发器。当水位线跳过了窗口完毕时刻,窗口则关闭和进行核算。
EMIT触发: 在window没有完毕的时分,答应提早把window核算的部分成果输出。一个不断变化的成果。
Evictor: 在触发器触发后 & 应用函数之前和/或之后 从窗口中删除元素。
迟到数据
迟到数据的界说:晚于 watermark 抵达,但可能它还在窗口中。
处理迟到数据的方法:
- 丢掉:flink 的默认处理方式
- Allow lateness(答应迟到):批改之前的成果,retract
- SideOutput(侧输出流):打tag,然后根据事务情况详细处理
核算形式
增量核算 vs 全量核算
数据到来时的两种核算形式:
- 增量核算:每条数据到来时,直接核算;只保存核算成果,如 sum、reduce、aggregate;
- 全量核算:数据到来时保存在窗口中,window 触发时一同核算;
增量核算模型
增量核算模型界说了当窗口核算之后内容怎么处理。三种战略:
- 丢掉:触发核算后,窗口内容被丢掉,后续的核算成果与从前的核算成果没有关系。
- 累积:触发核算后,窗口内容被完整保留在持久化状态中,后续的核算成果会批改从前的成果。
- 累积并撤回:触发核算后,在累积语义的基础上,输出成果的拷贝也被存储在了持久化状态中。当之后窗口再次触发核算时,会先引发从前成果的撤回,然后新的核算成果再发往下流。
示例
- 正确性、实时性、本钱
- 批流怎么统一
-
大局窗口,周期触发,累积形式
-
大局窗口,周期触发,丢掉形式
-
大局窗口,根据计数,丢掉形式
-
经典批处理
-
固定窗口,批处理
-
固定窗口,微批处理
-
固定窗口,流处理
-
固定窗口,流处理,多种触发方式(watermark)