目前比较流行的大数据混合处理引擎 Spark【基于内存】,基本上已经取代了 Hadoop 的 MapReduce【基于 IO】成为当前大数据处理的标准。Spark-Streaming 的流计算本质上还是批(微批)计算,Flink 是近年来在开源社区不断发展的技术中的能够同时支持高吞吐、低延迟、高性能的纯实时的分布式处理框架。
1. 简介
Flink 在德语中是快速和灵敏的意思,是数据的管道。
我们看一下官方定义:
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
翻译版本: Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
定义很简短,特点很鲜明:
- 是【框架】也是【分布式处理引擎】
- 【无界】流【有界】流进行【有状态】计算
- 【集群环境运行】【内存速度】【任意规模】
1.1 流
流是不停的,不舍昼夜的,在某种程度上,我们所定义的流都是有间断的,主观上,任何事物都可以从时间维度上进行切割,所以任何类型的数据都可以形成一种事件流【只是间断不同】,要明确一点的是,有界与无界是我们自己定义的,并不是流自身的属性。
无界流(unbounded stream):有始无终。无界流的数据需要持续处理,即数据被获取后需要立刻处理。因为没有定义流的终点,所以不能等到所有数据都到达。处理无界数据通常要求以特定顺序获取事件【例如给数据加上时间戳,有多种不同时间语义】,例如事件发生的顺序,以便能够推断结果的完整性。 有界流(bounded stream):有始有终。有界流可以在获取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序获取。有界流处理通常被称为批处理【历史数据处理就是典型的有界流】。
Flink 的核心是流处理,当然它也能支持批处理,Flink 将批处理看成是流处理的一种特殊情况,即数据流是有明确界限的。这和 Spark Streaming 的思想是完全相反的,Spark Streaming 的核心是批处理,它将流处理看成是批处理的一种特殊情况,即把数据流进行极小粒度的拆分,拆分为多个微批处理。
1.2 有状态
有状态流计算现在只有 Apache Flink,它通过实现 Google Dataflow 流式计算模型实现了高吞吐、低延迟、高性能兼具实时流式计算框架。同时 Flink 支持高度容错的状态管理,防止状态在计算过程中因为系统异常而出现丢失,Flink 周期性地通过分布式快照技术 Checkpoints 实现状态的持久化维护,使得即使在系统停机或者异常的情况下都能计算出正确的结果。
2. 核心架构
Flink 采用分层的架构设计,从而保证各层在功能和职责上的清晰。如下图所示,由上而下分别是 API & Libraries 层、Runtime 核心层以及物理部署层:

