flink有批处理和流处理的计算功能,其中批处理是用流计算来模拟,更多数据处理见:https://segmentfault.com/a/11...,分布式部署;计算相关的并行模式,流处理时间窗口,容错处理,增量计算等。
官方:https://flink.apache.orghtml
在 Hadoop 中 Map 和 Reduce 是两个独立调度的 Task,而且都会去占用计算资源。对 Flink 来讲 MapReduce 是一个 Pipeline 的 Task,只占用一个计算资源web
https://ci.apache.org/project...
以上有6个源,6个map,6个reduce。在2个TM(每一个3个slots)的并行执行方式以下算法
其中每一个可并行的有一个JV和并行的EV.好比source会在一个JV中保含6个EV,ExecutionGraph还包含IntermediateResult和IntermediateResultPartition。前者跟踪IntermediateDataSet的状态,后者是每一个分区的状态。apache
1)倾斜窗口(Tumbling Windows,记录没有重叠,固定窗口大小时间间隔)
2)滑动窗口(Slide Windows,记录有重叠,固定窗口大小和窗口间隔)
3)会话窗口(Session Windows,在内部,会话窗口操做员为每一个到达的记录建立一个新窗口,若是它们彼此之间的距离比定义的间隙更接近,则将窗口合并在一块儿。为了可合并的,会话窗口操做者须要一个合并触发器和一个合并 的窗函数)
4)全局窗口 全局窗口自动以触发器,自定义聚合方式等,
能够基于时间或数据计数(https://flink.apache.org/news...)segmentfault
事件时间,到达时间,处理时间
基于事件时间(事件建立时间)的水位线watermark算法(延后固定或推理出的关系式个时长,以便排除事件发生处处理的时长,来收集此刻建立的事件流):windows
当一、watermark时间 >= window_end_time(对于out-of-order以及正常的数据而言)&& 二、在[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执行批处理程序做为流程序的特殊状况,其中流是有界的(有限数量的元素)。所以,上述概念以相同的方式应用于批处理程序,而且它们适用于流程序,除了少数例外:
批处理程序的容错不使用检查点。经过彻底重放流来进行恢复。成本更低。
支持迭代计算。机器学习