编程模型
应该说Flink的编程编程模型和Spark Streaming的DStream还是非常相似的,也是抽象出了Stream概念来表示没有边界的数据流,针对Stream所施加的操作被称之为”transformation”,它会把一个流转换成另一个流作为转换的输出。与很多流计算模型一样,流的起点往往是数据的输入源,被称之为”source”,流的终点是数据的输出目的地,被成为“sink”。下 图形象地展示了Flink的流计算编程模型:
窗口计算
Flink同样支持窗口计算,并且提供多种不同的时间概念供开发者选择,这些时间概念包括:
- 事件时间:是事件创建的时间。它通常由事件中的时间戳描述,例如附接在生产传感器,或者生产服务。Flink通过时间戳分配器访问事件时间戳。
- 摄入时间:是事件进入Flink数据流源的时间。
- 处理时间:是每一个操作在执行时的本地时间。
这是我们第一次系统地梳理流计算时关于”时间”的概念,在前面介绍Spark Streaming时我们提到了事件时间,大多数时候,事件时间总是更具有实际参考价值,但是全面了解一下这三种时间的定义还是很有必要的,Flink正好给我们总结归纳好了:
批处理与更多的编程模型
Flink确实走了一条“不寻常”的路,它以它的流计算内核为基础,将数据处理能力从流计算拓展到了批处理,进而又在更上层提供了面向不同的计算需求的”上层库”,下图展示了Flink整体的架构和编程接口:
在流处理方面,Flink以DataStream API为基础,向上封装了两个DSL的库,一个是面向复杂事件处理的库:FlinkCEP,另一个是面向结构化数据操作的Table/sql引擎。在批处理方面,Flink提供了一组专门面向批处理的API- DataSet,然后以这个批处理平台为支撑,向上又分装了机器学习库FlinkML,图计算库Gelly以及Table /sql引擎。所以说,Flink并不是一个单纯的流计算引擎,而是和Spark一样,以一个核心的库或底层运行时为基础,同时提供流计算和批处理引擎,然后再向上分装各类应用库,进而形成了一个大的生态系统。