flink发展历史
在 2008 年,Flink 的前身已经是柏林理工大学一个研究性项目, 在 2014 被 Apache 孵化器所接受,然后迅速地成为了 ASF(Apache Software Foundation)的顶级项目之一
Flink 是一个针对流数据和批数据的分布式处理引擎。它主要是由 Java 代码实现。目前主要还是依靠开源社区的贡献而发展。对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已。再换句话说,Flink 会把所有任务当成流来处理,这也是其最大的特点。
flink架构介绍
从部署上讲,Flink支持三种模式 :
- local模式
- 集群模式(standalone集群或者Yarn集群)
- 云端部署
两种应用程序接口:
- DataStream API (流处理)
- DataSet API (批处理)
当程序在编译时,生成JobGraph。编译完成后,根据API的不同,优化器(批或流)会生成不同的执行计划。根据部署方式的不同,优化后的JobGraph被提交给了executors去执行。
flink作业调度模型
如图所示,Client、JobManager 和 TaskManager。
Client 用来提交任务给 JobManager,JobManager 分发任务给 TaskManager 去执行,然后 TaskManager 会心跳的汇报任务状态。
flink框架特性
高性能
支持高吞吐、低延迟、高性能的流处理。有状态计算的Exactly-once语义
有状态意味着程序可以保持已经处理过的数据,同时Flink的checkpoint机制可以确保在发生故障时应用程序状态的一致性语义。高度灵活的窗口
Flink支持数据驱动的窗口,这意味着我们可以基于时间(event time或processing time)、count和session来构建窗口。容错机制
它使得系统既能保持高的吞吐率又能保证exactly-once的一致性,使Flink能从零数据丢失的故障中恢复,通过分布式状态快照(Snapshot)实现内存管理
Flink在JVM内部进行内存的自我管理,使得其独立于java本身的垃圾回收机制。当处理hash、index、caching和sorting时,Flink自我的内存管理方式使得这些操作很高效。但是,目前自我的内存管理只在批处理中实现,流处理程序并未使用。优化器
避免特定情况下Shuffle、排序等昂贵操作,中间结果进行缓存,确保避免过度的磁盘IO。批流统一
运行时同时支持流计算和批计算两套API。
Flink中的流处理优先原则,认为批处理是流处理的一种特殊情况。Libraries库
Flink提供了用于机器学习、图计算、Table API等库,同时Flink也支持复杂的CEP处理和警告。事件时间
Flink支持Event Time语义的处理,这有助于处理流计算中的乱序问题,有些数据也许会迟到,我们可以通过基于event time、count、session的窗口来处于这样的场景。savepoints 状态版本控制
可以将应用的运行状态保存下来,使得在升级应用或处理历史数据时,而不会丢失状态和确保宕机时间最小反压
支持具有反压(Backpressure)功能的持续流模型