一、Flink架构
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。 Flink 旨在运行在所有常见的集群环境中,以内存速度和任何规模执行计算。
1,处理有界和无界数据流
任何类型的数据都是作为事件流产生的。 信用卡交易、传感器测量、机器日志或用户在网站或移动应用程序上的交互,所有这些数据都是作为流生成的。
- 无界数据流没有定义开始和结束。
- 有界数据流定义了开始和结束。
2,随处发布任务
Apache Flink 是一个分布式系统,需要计算资源才能执行应用程序。 Flink 集成了所有常见的集群资源管理器,例如 Hadoop YARN、Apache Mesos 和 Kubernetes,但也可以设置为作为独立集群运行。
3,任意规模的任务
Flink 旨在以任何规模运行有状态的流应用程序。 应用程序被并行化为可能在集群中分布式和并发执行的数千个任务。 因此,应用程序可以利用几乎无限量的 CPU、主内存、磁盘和网络 IO。 而且,Flink 很容易维护非常大的应用状态。 其异步和增量检查点算法可确保对处理延迟的影响最小,同时保证恰好一次的状态一致性。
4,充分利用内存性能
有状态 Flink 应用程序针对本地状态访问进行了优化。 任务状态始终保存在内存中,或者如果状态大小超过可用内存,则保存在访问高效的磁盘数据结构中。 因此,任务通过访问本地的、通常在内存中的状态来执行所有计算,从而产生非常低的处理延迟。 Flink 通过定期和异步地将本地状态检查点到持久存储来保证在发生故障时的一次性状态一致性。
二、基本组件
Job Manager & Task Manager & slot
Flink 整个系统主要由两个组件组成,分别为 JobManager 和 TaskManager,Flink 架构也遵循 Master - Slave 架构设计原则,JobManager 为 Master 节点,TaskManager 为 Worker (Slave)节点。
一个 Flink Cluster 是由一个 Flink Master 和多个 Task Manager 组成的,Flink Master 和 Task Manager 是进程级组件,其他的组件都是进程内的组件。
Job Manager 中的 Scheduler 组件负责调度执行该 Job 的 DAG 中所有 Task ,发出资源请求,即整个资源调度的起点;JobManager 中的 Slot Pool 组件持有分配到该 Job 的所有资源。另外,Flink Master 中唯一的 Resource Manager 负责整个 Flink Cluster 的资源调度以及与外部调度系统对接,这里的外部调度系统指的是 Kubernetes、Mesos、Yarn 等资源管理系统。
Task Manager 负责 Task 的执行,其中的 Slot 是 Task Manager 资源的一个子集,也是 Flink 资源管理的基本单位,Slot 的概念贯穿资源调度过程的始终。
2.1 JobManager
JobManager 负责整个 Flink 集群任务的调度以及资源的管理,从客户端中获取提交的应用,然后根据集群中 TaskManager 上 TaskSlot 的使用情况,为提交的应用分配相应的 TaskSlot 资源并命令 TaskManager 启动从客户端中获取的应用。
JobManager 相当于整个集群的 Master 节点,且整个集群有且只有一个活跃的 JobManager ,负责整个集群的任务管理和资源管理。
JobManager 和 TaskManager 之间通过 Actor System 进行通信,获取任务执行的情况并通过 Actor System 将应用的任务执行情况发送给客户端。
同时在任务执行的过程中,Flink JobManager 会触发 Checkpoint 操作,每个 TaskManager 节点 收到 Checkpoint 触发指令后,完成 Checkpoint 操作,所有的 Checkpoint 协调过程都是在 Fink JobManager 中完成。
当任务完成后,Flink 会将任务执行的信息反馈给客户端,并且释放掉 TaskManager 中的资源以供下一次提交任务使用。
2.2 TaskManager
TaskManager 相当于整个集群的 Slave 节点,负责具体的任务执行和对应任务在每个节点上的资源申请和管理。
客户端通过将编写好的 Flink 应用编译打包,提交到 JobManager,然后 JobManager 会根据已注册在 JobManager 中 TaskManager 的资源情况,将任务分配给有资源的 TaskManager节点,然后启动并运行任务。
TaskManager 从 JobManager 接收需要部署的任务,然后使用 Slot 资源启动 Task,建立数据接入的网络连接,接收数据并开始数据处理。同时 TaskManager 之间的数据交互都是通过数据流的方式进行的。
可以看出,Flink 的任务运行其实是采用多线程的方式,这和 MapReduce 多 JVM 进行的方式有很大的区别,Flink 能够极大提高 CPU 使用效率,在多个任务和 Task 之间通过 TaskSlot 方式共享系统资源,每个 TaskManager 中通过管理多个 TaskSlot 资源池进行对资源进行有效管理。
2.3 slot
slot在Flink里面可以认为是资源组,Flink是通过将任务分成子任务并且将这些子任务分配到slot来并行执行程序。
每个Flink TaskManager在集群中提供处理槽。 插槽的数量通常与每个TaskManager的可用CPU内核数成比例。一般情况下你的slot数是你每个TM的cpu的核数。
参考
【1】Flink 官网
【2】Flink JobManager 和 TaskManager 原理
【3】Flink中slot的一点理解:https://blog.csdn.net/a6822342/article/details/77531000
【4】深入解读 Flink 资源管理机制 :https://www.sohu.com/a/404679408_120342237