一、Flink的基本组件

1.DataSource-- 数据源

顾名思义,DataSource也就是数据源,可以来源于任何地方。

2.Transformation-- 算子

Transformation,算子,是一个计算单位,意味着你如何去处理来自DataSource的数据

3.DataSink – 数据输出

数据输出的位置可以自行选择,数据库、分布式文件系统、文件等等。

小结:

三个基本组件很简单,就好比是一个方法,与 入参+逻辑+返回值 的逻辑模型一致。

二、Flink的流处理与批处理

Flink的计算模型可以分为Streaming流处理与Batch批处理。

那么他们的各自的基本思想是如何的呢?

1.流处理

流处理,是指数据源是源源不断的涌入,或者说系统是不知道数据源的边界情况的。

这是什么意思呢?

例如一个文件,系统在文件读取完毕后便知道其准确的数据大小。而如果系统引入一个外部输入源,即使可能这个外部输入源在今天之后便不再向你的Flink系统发送任何数据,但只要他们之间保持连接,对于你的Flink系统而言,输入源的情况就是未知的,它就会傻傻的保持服务开启并且等待下一条数据的到来。

2.批处理

批处理是否就是意味着系统知晓数据源的准确大小呢?

我认为答案是未必,对于Flink而言,Flink的批处理系统是建立在流处理模型之上的。这句话如何理解呢?

flink批处理和spark批处理区别 flink 批处理原理_流处理


上面是Flink官网的图片,可以看到一个unbounded stream和一个bounded stream。

unbounded stream,无限流,你可以将灰色竖条看做一条数据,然后想象“管道”最左侧有一个透明的处理层,数据源源不断地从future流入,每条数据都处理层处理后,然后向外流出。
bounded stream,有限流,你可以看到图片中将多条数据进行了一个分组,这时候每一组数据便形成一个批量化的数据,然后经由处理层进行处理。但重点在于,它的数据来源依然对系统不可知的,所以与流处理真的存在本质上的区别吗?

所以我认为,Flink的批处理可以看做一种细粒度更大的流处理模式(目前我还不知道它是否也良好支持大量但有限的数据量的计算,如果也支持这种模型,相较而言,Spark的处理模型可能更加专业),与传统的批处理模型还是存在设计层面的区别。