Flink 是构建在数据流之上的一款有状态的流计算框架,通常被人们称为第三代大数据分析方案
第一代大数据处理方案
:基于Hadoop的MapReduce 静态批处理 | Storm 实时流计算 ,两套独立的计算引擎,难度大(2014年9月
)
第二代大数据处理方案
:Spark RDD 静态批处理、Spark Streaming(DStream)实时流计算(实时性差),统一的计算引擎,难度小(2014年2月
)
第三代大数据分析方案
:Flink DataSet 批处理框架、Apache Flink DataStream 流处理框架(2014年12月
)
可以看出Spark和Flink几乎同时诞生,但是Flink之所以成为第三代大数据处理方案,主要是因为早期人们对大数据分析的认知不够深刻或者业务场景大都局限在批处理领域,从而导致了Flink的发展相比于Spark较为缓慢,直到2017年人们才开始慢慢将批处理
转向流处理
更多介绍:https://blog.csdn.net/weixin_38231448/article/details/100062961
流计算场景:实时计算领域、系统监控、舆情监控、交通预测、国家电网、疾病预测、银行/金融风控等领域
Spark VS Flink
Flink的核心是一个流式的数据流执行引擎,针对数据流的分布式计算,它提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务,例如:
DataSet API,对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python语言。
DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala语言。
Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala语言。
此外,Flink还针对特定的应用领域提供了领域库,例如:
Flink ML,Flink的机器学习库,提供了机器学习Pipelines API,并实现了多种机器学习算法。
Gelly,Flink的图计算库,提供了图计算的相关API及多种图计算的算法实现。
Flink 架构
Flink概念
Tasks and Operator Chains(阶段划分)
对于Flink分布式任务的执行,Flink尝试根据任务计算的并行度,将若干个操作符连接成一个任务Task(相当于Spark框架中的阶段-Stage
),一个Flink计算任务通常会被拆分成若干个Task(阶段),每一个Task都有自己的并行度,每一个并行度表示一个线程(SubTask)。
- Task等价于Spark任务中的Stage
- Operator Chain,Flink通过Operator Chain方式实现Task划分,有点类似于Spark的宽窄依赖,Operator Chain方式有两种:forward、hash | rebalance
Job Managers、Task Managers、Clients
JobManagers(Master) - 协调并行计算任务,负责调度Task、协调CheckPoint以及故障恢复,它等价于Spark中的Master+Driver
。
There is always at least one Job Manager. A high-availability setup will have multiple JobManagers, one of which one is always the leader, and the others are standby.
TaskManagers(Slaves)- 真正负责Task划分的执行节点(执行SubTask或线程),同时需要向JobManagers汇报节点状态以及工作负荷。
Clients - 与Spark不同,Client并不是集群计算的一部分,它只负责将任务Dataflow
(类似Spark DAG图)提交给JobManager,任务提交完成可以退出,而Spark中的Client被称为Driver,负责生产DAG并且监控整个任务的执行过程和故障恢复。
Task Slots and Resources
每个Worker(TaskManager)是一个JVM进程,可以执行一个或多个子任务(Thread或SubTask),为了控制Woker能够接受多少个任务,Woker具有所谓的Task Slot(至少一个Task Slot)。
每个Task Slot代表TaskManager资源的固定子集。例如具有3个Task Slot的TaskManager,则每个Task Slot表示占用当前TaskManager进程1/3的内存,每个Job在启动时都有自己的Task Slot,数目固定,这样通过Task Slot的划分就可以避免不同Job的SubTask之间竞争内存资源,以下表示一个Job获取6个Task Slot,但是仅仅只有5个线程,3个Task。
在默认情况下,来自同一个Job的不同Task(阶段)的SubTask可以共享一个Task Slot,Job计算所需Task Slot的个数由Task中的最大并行度所决定。
- Flink集群所需的任务槽与作业中使用的最高并行度恰好一样多。
- 更容易获得更好的资源利用率。如果没有Task Slot共享,则非密集型source子任务将阻塞与资源密集型window子任务一样多的资源,通过Task Slot共享可以将任务并行度由2增加到6,从而得到如下资源分配:
参考:https://ci.apache.org/projects/flink/flink-docs-release-1.9/concepts/runtime.html