Flink基本原理及应用场景
Flink简介
-
Apache Flink是一个开源的分布式、高性能、高可用的流处理框架。
-
主要有Java代码实现,支持scala和java API。
-
支持实时流(stream)处理和批(batch)处理,批数据只是流数据的一个极限特例。
-
Flink原生支持了迭代计算、内存管理和程序优化。
Flink、Spark和Storm对比
Flink、Spark Streaming、Storm、Storm Trient都可以进行实时计算,但各有特点。
在大数据处理领域,批处理任务和流处理任务一般被认为是两种不同的任务,一个大数据框架一般会被设计为只能处理其中一种任务
* 例如Storm只支持流处理任务,而MapReduce、Spark只支持批处理任务。Spark Streaming是采用了一种micro-batch的架构,即把输入的数据流且分为细粒度的batch,并为每一个batch数据提交一个批处理的Spark任务,所以Spark Streaming本质上还是基于Spark批处理系统对流式数据进行处理,和Storm等完全流式的数据处理方式完全不同。
* Flink通过灵活的执行引擎,能够同时支持批处理任务和流处理任务
在执行引擎这一层,流处理系统与批处理系统最大的不同在于节点间的数据传输方式。
对于一个流处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理。
而对于一个批处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,并不会立刻通过网络传输到下一个节点,当缓存写满,就持久化到本地硬盘上,当所有数据都被处理完成后,才开始将处理后的数据通过网络传输到下一个节点。
这两种数据传输模式是两个极端,对应的是流处理系统对低延迟的要求和批处理系统对高吞吐量的要求。
Flink的执行引擎采用了一种十分灵活的方式,同时支持了这两种数据传输模型。
Flink以固定的缓存块为单位进行网络数据传输,用户可以通过设置缓存块超时值指定缓存块的传输时机。如果缓存块的超时值为0,则Flink的数据传输方式类似上文所提到流处理系统的标准模型,此时系统可以获得最低的处理延迟。
如果缓存块的超时值为无限大,则Flink的数据传输方式类似上文所提到批处理系统的标准模型,此时系统可以获得最高的吞吐量。
同时缓存块的超时值也可以设置为0到无限大之间的任意值。缓存块的超时阈值越小,则Flink流处理执行引擎的数据处理延迟越低,但吞吐量也会降低,反之亦然。通过调整缓存块的超时阈值,用户可根据需求灵活的权衡系统延迟和吞吐量。
如何选择实时框架:
1:需要关注流数据是否需要进行状态管理
2:At-least-once或者Exectly-once消息投递模式是否有特殊要求
3:对于小型独立的项目,并且需要低延迟的场景,建议使用storm
4:如果你的项目已经使用了spark,并且秒级别的实时处理可以满足需求的话,建议使用spark streaming
5:要求消息投递语义为Exactly Once的场景;数据量较大,要求高吞吐低延迟的场景;需要进行状态管理或窗口统计的场景,建议使用flink
Flink架构
- 支持scala和java API
- 支持Table(SQL)
- 支持图操作(Flink Gelly)
- 支持机器学习(Flink ML)
- 支持将Flink程序部署到Yarn
Flink基本组件
Flink应用场景分析
- 优化电商网站的实时搜索结果
- 针对数据分析团队提供实时流处理服务
- 网络/传感器检测和错误检测
- 商业智能分析ETL