Flink系统架构|青训营笔记
1. flink简介
官方定义:
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。
定义中主要有两个关注点:
- 针对有界和无界数据流
- 有状态计算
除了上述的定义之外,flink的其它特性如下所示:
- 支持高吞吐、低延迟、高性能的流处理
- 支持带有事件时间的窗口(Window)操作
- 支持有状态计算的 Exactly-once 语义
- 支持高度灵活的窗口(Window)操作,支持基于 time、count、session,以及 data-driven 的窗口操作
- 支持具有 Backpressure 功能的持续流模型
- 支持基于轻量级分布式快照(Snapshot)实现的容错
- Flink 在 JVM 内部实现了自己的内存管理
- 支持迭代计算
- 支持程序自动优化:避免特定情况下 Shuffle、排序等昂贵操作,中间结果有必要进行缓存
2.flink于其它引擎的效果对比
从图中可以得知,相较于Spark Streaming的微批处理放式,flink有着更高的处理速度,而较于Storm,flink的精确一致性有好的优势,以及flink的高吞吐,甚至flink的SQL化使得flink更为普及
3.flink的架构
3.1 flink的分层架构
下图为flink的分层架构图
1.SDK层:flink的最顶层包括有SQL/Table,DataStream,Python三个类
2.Runtime层:这一层提供了统一的DAG,用来描述处理数据的Pipeline,并转化为DAG图,调度层再把DAG转化为分布式环境下的TASK,其之间通过Shuffle传输数据
3.状态存储层:负责存储算子的状态信息
4.资源调度层:目前flink可以部署在多种环境下
3.2 flink的整体架构
在flink的整体架构中,主要包括有JobManger和TaskManger两个核心组件,接下来针对这两个核心组件进行详细介绍。 flink整体架构图:
3.2.1 JobManger
Flink遵循Master-Slave原则,JobManager为Master节点,TaskManager为Slave节点.
- 作为主进程(Master Process),JobManager控制着单个应用程序的执行,也就是每个应用都由一个不同的JobManager管理。
- JobManager可以接受需要执行的应用,该应用会包含一个所谓的Job Graph(任务图),即逻辑Dataflow Graph(数据流图),以及一个打包了全部所需类、库以及其他资源的JAR文件。
- JobManager将JobGraph转化为名为Execution Graph(执行图)的物理Dataflow Graph,其中包含了所有可以并发实行的任务。
- JobManager会从ResourceManager申请执行任务的必要资源——TaskManager slot,一旦它收到了足够数量的TaskManager slot,它就会将Execution Graph中的任务分发给TaskManager来执行。在执行过程中,JobManager还要负责所有需要集中协调的操作,如创建CheakPoint等。
3.2.2 TaskManger
- TaskManager是Flink的工作进程(Worker Process),在Flink的搭建过程中要启动多个TaskManager。每个TaskManager提供一定数量的slot(处理槽),slot的数量限制了TaskManager可执行的任务数。
- TaskManager在启动之后会向ResourceManager注册它的slot,当接收到ResourceManager的指示时,TaskManager会向JobManager提供一个或者多个slot。之后JobManager就可以向slot中分配任务来执行。
- 在执行过程中,运行同一应用的不同任务的TaskManager之间会产生数据交换。