文报 2019-07-01
flink有批处理和流处理的计算功能,其中批处理是用流计算来模拟,更多数据处理见:https://segmentfault.com/a/11...,分布式部署;计算相关的并行模式,流处理时间窗口,容错处理,增量计算等。
官方:https://flink.apache.org
在 Hadoop 中 Map 和 Reduce 是两个独立调度的 Task,并且都会去占用计算资源。对 Flink 来说 MapReduce 是一个 Pipeline 的 Task,只占用一个计算资源
https://ci.apache.org/project...
以上有6个源,6个map,6个reduce。在2个TM(每个3个slots)的并行执行方式如下
其中每个可并行的有一个JV和并行的EV.比如source会在一个JV中保含6个EV,ExecutionGraph还包含IntermediateResult和IntermediateResultPartition。前者跟踪IntermediateDataSet的状态,后者是每个分区的状态。
1)倾斜窗口(Tumbling Windows,记录没有重叠,固定窗口大小时间间隔)
2)滑动窗口(Slide Windows,记录有重叠,固定窗口大小和窗口间隔)
3)会话窗口(Session Windows,在内部,会话窗口操作员为每个到达的记录创建一个新窗口,如果它们彼此之间的距离比定义的间隙更接近,则将窗口合并在一起。为了可合并的,会话窗口操作者需要一个合并触发器和一个合并 的窗函数)
4)全局窗口 全局窗口自动以触发器,自定义聚合方式等,
可以基于时间或数据计数(https://flink.apache.org/news...)
事件时间,到达时间,处理时间
基于事件时间(事件创建时间)的水位线watermark算法(延后固定或推理出的关系式个时长,以便排除事件发生到处理的时长,来收集此刻创建的事件流):
当1、watermark时间 >= window_end_time(对于out-of-order以及正常的数据而言)&& 2、在[window_start_time,window_end_time)中有数据存在 时窗口关闭开始计算
如下图:设定的maxOutOfOrderness=10000L(10s),窗口3s
定期水位线
用户定义maxOutOfOrderness,两次水位线之间的数据可以用来调用方法生成下一次的时间,再往后推迟maxOutOfOrderness的时间即可。比如
class BoundedOutOfOrdernessGenerator extends AssignerWithPeriodicWatermarks[MyEvent] { val maxOutOfOrderness = 3500L; // 3.5 seconds var currentMaxTimestamp: Long; override def extractTimestamp(element: MyEvent, previousElementTimestamp: Long): Long = { val timestamp = element.getCreationTime() currentMaxTimestamp = max(timestamp, currentMaxTimestamp) timestamp; } override def getCurrentWatermark(): Watermark = { // return the watermark as current highest timestamp minus the out-of-orderness bound new Watermark(currentMaxTimestamp - maxOutOfOrderness); } }
对齐
(google的millwheel用的每个数据生成唯一编号,dedup去重实现exactly-once(milwheel)) 接收到一个流的n后,这个流的数据暂存,直到其他流也到n,对其发出快照。避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存
Flink执行批处理程序作为流程序的特殊情况,其中流是有界的(有限数量的元素)。因此,上述概念以相同的方式应用于批处理程序,并且它们适用于流程序,除了少数例外:
批处理程序的容错不使用检查点。通过完全重放流来进行恢复。成本更低。
支持迭代计算。