一、Flink的基本组件
1.DataSource-- 数据源
顾名思义,DataSource也就是数据源,可以来源于任何地方。
2.Transformation-- 算子
Transformation,算子,是一个计算单位,意味着你如何去处理来自DataSource的数据
3.DataSink – 数据输出
数据输出的位置可以自行选择,数据库、分布式文件系统、文件等等。
小结:
三个基本组件很简单,就好比是一个方法,与 入参+逻辑+返回值 的逻辑模型一致。
二、Flink的流处理与批处理
Flink的计算模型可以分为Streaming流处理与Batch批处理。
那么他们的各自的基本思想是如何的呢?
1.流处理
流处理,是指数据源是源源不断的涌入,或者说系统是不知道数据源的边界情况的。
这是什么意思呢?
例如一个文件,系统在文件读取完毕后便知道其准确的数据大小。而如果系统引入一个外部输入源,即使可能这个外部输入源在今天之后便不再向你的Flink系统发送任何数据,但只要他们之间保持连接,对于你的Flink系统而言,输入源的情况就是未知的,它就会傻傻的保持服务开启并且等待下一条数据的到来。
2.批处理
那批处理是否就是意味着系统知晓数据源的准确大小呢?
我认为答案是未必,对于Flink而言,Flink的批处理系统是建立在流处理模型之上的。这句话如何理解呢?
上面是Flink官网的图片,可以看到一个unbounded stream和一个bounded stream。
unbounded stream,无限流,你可以将灰色竖条看做一条数据,然后想象“管道”最左侧有一个透明的处理层,数据源源不断地从future流入,每条数据都处理层处理后,然后向外流出。
bounded stream,有限流,你可以看到图片中将多条数据进行了一个分组,这时候每一组数据便形成一个批量化的数据,然后经由处理层进行处理。但重点在于,它的数据来源依然对系统不可知的,所以与流处理真的存在本质上的区别吗?
所以我认为,Flink的批处理可以看做一种细粒度更大的流处理模式(目前我还不知道它是否也良好支持大量但有限的数据量的计算,如果也支持这种模型,相较而言,Spark的处理模型可能更加专业),与传统的批处理模型还是存在设计层面的区别。