前言
Flink起源于Stratosphere项目,Stratosphere是在2010~2014年由3所地处柏林的大学和欧洲的一些其他的大学共同进行的研究项目,2014年4月Stratosphere的代码被复制并捐赠给了Apache软件基金会,参加这个孵化项目的初始成员是Stratosphere系统的核心开发人员,2014年12月,Flink一跃成为Apache软件基金会的顶级项目。在德语中,Flink一词表示快速和灵巧,项目采用一只松鼠的彩色图案作为logo,这不仅是因为松鼠具有快速和灵巧的特点,还因为柏林的松鼠有一种迷人的红棕色,而Flink的松鼠logo拥有可爱的尾巴,尾巴的颜色与Apache软件基金会的logo颜色相呼应,也就是说这是一只Apache风格的松鼠。
一、Flink简介
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
1.1 初识Flink

1.2 Flink的重要特点
1.2.1 事件驱动型(Event-driven) 事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比较典型的就是以kafka为代表的消息队列几乎都是事件驱动型应用。(Flink的计算也是事件驱动型)。 ? 与之不同的就是SparkStreaming微批次,如图:  ? 事件驱动型: 
1.2.2 流与批的世界观
批处理的特点是有界、大量,非常适合需要访问全套记录才能完成的计算工作,一般用于离线统计。
流处理的特点是无界、实时,无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计。
在spark的世界观中,一切都是由批次组成的,离线数据是一个大批次,而实时数据是由一个一个无限的小批次组成的。
而在flink的世界观中,一切都是由流组成的,离线数据是有界限的流,实时数据是一个没有界限的流,这就是所谓的有界流和无界流。
无界数据流:
无界数据流有一个开始但是没有结束,它们不会在生成时终止并提供数据,必须连续处理无界流,也就是说必须在获取后立即处理event。对于无界数据流我们无法等待所有数据都到达,因为输入是无界的,并且在任何时间点都不会完成。处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取event,以便能够推断结果完整性。
有界数据流:
有界数据流有明确定义的 开始和结束,可以在执行任何计算之前通过获取所有数据来处理有界流,处理有界流不需要有序获取,因为可以始终对有界数据集进行排序,有界流的处理也称为批处理。

1.2.3 Flink 的应用场景 
二、为什么要用Flink
2.1 批处理与流处理

三、数据处理框架演变
3.1 事务处理
 这是传统数据处理的事务处理方式:前台发送请求->后台逻辑->调用数据库->返回数据。特点:架构简单,容易存储但是查询数据量过大性能瓶颈受限且无法做到数据实时处理。
3.2 分析处理
 分析处理是基于事务处理之上的,其在计算层和存储层中间加入一层如redis缓存数据库,基于内存的数据处理消息响应更快,效率更高。特点:内存处理可定时写入关系型数据库,做到数据持久化。可集群操作,但是流处理先后顺序成为难题而批处理更容易实现。
3.3 Lambda架构
 Lambda架构同时兼顾批处理和实时处理(流处理),保证低延迟和高吞吐的要求。特点:成本开销大,一个需求需要两个或两个以上的开发维护成本。
3.4 新一代流处理器Flink
 Flink用一套系统实现了Lambda两套功能,既保证低延迟又保证高吞吐。
四、流处理的应用场景
4.1 事件驱动型应用

4.2 数据分析型应用

4.3 分层API

越顶层越抽象,表达含义与简明,使用越方便。 越顶层越具体,表达能力越丰富,使用越灵活。 最底层级的抽象仅仅提供了有状态流,它将通过过程函数Process Function被嵌入到DataStream API中。底层过程函数Process Function 与 DataStream API 相集成,使其可以对某些特定的操作进行底层的抽象,它允许用户可以自由地处理来自一个或多个数据流的事件,并使用一致的容错的状态。除此之外,用户可以注册事件时间并处理时间回调,从而使程序可以处理复杂的计算。
五、Flink vs Spark
5.1 数据处理架构

5.2 数据模型

5.3 运行时架构

|