Apache Flink介绍
俗话说知子莫若父,要想了解一门技术就要看官方的介绍。Flink官网对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被设计成可以在所有常见的集群环境中运行,以内存速度和任何规模执行计算。
似乎太笼统了。接下来我们就深入的了解一下Flink究竟是一个什么鬼。
数据架构的演变
要想了解Flink我们还得从分布式计算的历史讲起,所以历史课时间到。
在国外一些社区,有很多人讲计算引擎分为了四代,虽然这并不能代表所有人的观点,但是我们可以在这些分代中看出计算引擎的区别。
首先第一代的计算引擎,无疑就是Hadoop承载的MapReduce了。相信了解大数据的童鞋对MapReduce都不会陌生,它将计算分成两部分,一部分是Map阶段,一部分是Reduce阶段。这对于上层应用来说就不得不拆分算法。如果是较为复杂的计算,甚至于不得不实现多个Job的串联,例如迭代计算。
由于第一代计算引擎的弊端,催生了支持DAG ( Directed Acyclic Graph)框架的诞生。支持DAG框架的计算引擎被划分为了第二代计算引擎,比如Tez或Oozie。第二代计算引擎执行的大多数是批量任务。
前两代的计算引擎都是延迟较为严重,没法满足实时性要求比较高的需求。而以Spark为代表的第三代计算引擎很好的解决了这一问题。第三代计算引擎的特点主要是 Job 内部的 DAG 支持(不跨越Job),以及强调的实时计算。这里强调一点,这里的实时计算实质上是微批处理,并不是真正意义上的实时处理。
接下来的第四代计算引擎实现了真正意义上的实时处理,这就是我们今天介绍的Flink。当然Flink除了能够实现数据的实时处理外也很好的支持了批处理和DAG的运算。
迭代计算性能对比测试:Flink > Spark > Hadoop(MR)。迭代次数越多越明显,性能上Flink优于Spark和Hadoop最主要的原因是Flink支持增量迭代,具有对迭代自动优化的功能。
两种数据集和两种处理方式
有界数据与无界数据
Flink最大的特色就是它的流式处理方式。而在介绍Flink的流式处理我们要先了解一下有界数据和无界数据,好,上图:
有界数据流(bounded stream):具有定义的开始点和结束点。
无界数据流(unbounded stream):有一个起点,但没有定义的终点。
无界数据集包括但不限于如下
- 终端用户与APP或WEB交互的数据
- 物理传感器采集的数据
- 金融市场行情
- 系统或机器日志
就现实来说,在Flink出现之前由于处理方式的局限性,我们通常会将一些无界数据流人为的切分成有界数据流,然后在基于有界数据流进行处理。
流处理与批处理
流处理(Streaming):只要有数据生成则马上执行计算程序
批处理(Batch):在有限的时间内执行并运行到完成的处理,完成后释放计算资源
由此可见Spark Streaming其实是批处理。
我们可以使用任一类型的处理模型来处理任一类型的数据集,但不一定是最优的方案。事实上在以前我们一直在用批处理来处理无界数据集,甚至是现在依然在用。
多样的部署方式
Flink提供了多种集群搭建方式:
- standalone cluster模式:不依赖于任何第三方资源管理器,Flink可以作为独立的集群运行
- 基于第三方资源管理器:Flink与所有常见的集群资源管理器(如Hadoop YARN,Apache Mesos和Kubernetes集成)
- Local模式:顾名思义,就是本地单机模式。
支持任意数据规模
Flink与所有的大数据计算框架一样,支持横向扩展。也就是说,理论上Flink可以支持无限量的CPU、内存、磁盘和网络IO。