Flink是什么?
Flink是一个框架,是一个用于有限(bounded)或者无限(unbounded)数据流上进行有状态计算的分布式处理引擎。
处理框架
Flink的软件栈如图一所示,其核心是distributed dataflow engine用于执行数据流处理程序。Flink运行时程序是一个通过有状态的算子连接的数据流的有向无环图(DAG),对上提供有限数据流的DataSet API和无限数据流的DataStream API。
如图二所示,Flink集群包含三类角色,client、JobManager和TaskManager。client将数据处理程序转换为DAG图并提交到JobManager。JobManager协调程序的执行,并跟踪每一个算子的状态以实现故障恢复。TaskManager从JobManager处接收需要部署的Task,负责具体数据处理程序的执行,一个TaskManager执行一个或者多个算子处理数据流,并将状态上报至JobManager。
这里的算子就是一个独立数据处理程序,常用的有map、flatmap、keyBY、sum、Apply、reduce、window等。其中,map和flatMap的区别是map是一对一的映射,既一个输入对应一个输出。faltMap是一对多映射,一个输入对应0个或者多个输出。
通过上述论述,Flink程序的实质就是用多个算子组合在一起形成一个有向无环图,理解了这一点flink的程序就不难理解了。下面有个简单的例子:
简单示例
Time
在Flink中定义了三种时间概念,分别是Event Time,Ingestion Time和Processing Time。
Processing Time顾名思义就是处理收到事件的系统时间,由于它不需要要数据流和处理机器间的时间协调,所以具备最低的延迟。但是,在分布式和异步的环境下,Processing Time不能提供确定性,因为它容易受到事件到达Flink系统的速度、事件在Flink系统内操作流动的速度以及中断的影响。
Event Time是事件发生时间,一般指的是数据本身携带的时间戳。Event Time 程序必须指定如何生成 Event Time 水印,这是表示 Event Time 进度的机制。理想的情况是,无论事件什么时候到达或者其怎么排序,最后处理Event Time将产生完全一致和确定的结果。但是,实际上除非事件按照已知顺序(按照事件的时间)到达,否则处理 Event Time 时将会因为要等待一些无序事件而产生延迟。由于Flink程序只能等待一段有限的时间,因此就难以保证处理Event Time将产生完全一致和确定的结果。
Ingestion Time是事件进入flink系统的时间。Ingestion Time 程序无法处理任何无序事件或延迟数据,但程序不必指定如何生成水印。在 Flink 中,Ingestion Time 与 Event Time 非常相似,但 Ingestion Time 具有自动分配时间戳和自动生成水印功能。
三个时间之间的关系通过一张图可以形象的显示出来:
参考
Apache Flink: Stream and Batch Processing in a Single Engine
https://ci.apache.org/projects/flink/flink-docs-stable/dev/event_time.html
https://segmentfault.com/a/1190000017874211