Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams.
上述那句话是flink官网对flink的描述。
我们可以总结出两点计算特征:
- 分布式
- 有状态计算
分布式很好理解。在大数据时代,作为数据处理引擎,分布式是必须的能力,相信大家有很好的理解,这里不再赘述。而有状态计算应该怎么理解呢?
有状态计算
在前面我们提到,流计算在数据一来就会进行计算,得到中间结果。这个中间结果往往是之前来到的数据的综合计算结果,而不仅仅是这一条数据本身,即计算结果要依赖历史数据。这个时候,我们要么就是保存历史数据,要么就是保存历史数据的计算结果,然后再与新来的数据一起处理得到最新结果。而保存的历史数据或者历史计算结果就是状态。现在我们再来看有状态计算这个概念,就可以理解为保存了历史数据或历史计算结果的计算。如下图所示:
在第三列算子旁边的两个数据存储就是状态。
之前的计算引擎要实现这个功能,往往要借助于外部存储,如mysql,redis等,而flink原生支持了有状态计算,直接将状态保存在本地(内存或本地磁盘),大大提高了状态计算api的易用性,提升了程序运行速度和吞吐量,降低了延迟。
我们来看下flink的计算过程:
首先数据input进来,在各个task中处理,处理的同时还要获取状态,处理完成后输出。理解这个有状态计算后,可以发现整体的计算流程就是很简单的。