PS: 这里常说的 Job = 一个应用
Task = 一个任务
总的来讲:
1.Flink应用程序会首先提交给JobClient,做解析和算子链化
2.然后会提交给JobManager,进行资源分配,将任务分给TaskManager
3.TaskManager会启动相应的Slot线程,进行任务处理,在处理过程中会持续向JobManager,返回任务状态(任务开始,进行中,已完成等)
4.任务执行完以后,执行结果会被返回给客户端Client
1.基本原理
主要采用主从节点架构,即master 和work 节点
分为两部分:JobManage(master节点)r和 TaskManager(work节点)
1.1 jobClient 节点
JobClient主要是负责接收应用程序,并解析和优化执行计划,然后提交执行计划到JobManager.
这里的优化执行主要是将相临的算子进行融合,形成算子链,减少任务数量,提高JobManager中Task的资源利用率。
1.2 JobManager
JobManager负责Flink整个集群的调度以及资源的管理。
1.分配资源
从JobClient 接收任务,然后根据TaskManager中task slot的使用情况,为提交的应用分配相应的slot资源,并命令TaskManager启动从Client中获取的应用。
2.高可用机制
另外为了保障高可用,一般会有多个JobManager 同时存在,多个JobManager节点也是采取主从模式,选举出一个主节点工作,其他几个从节点会闲置。当主节点挂掉后,会从剩余的从节点中选举出新的节点,作为主节点。
3.容错
检查点机制
1.3 TaskManager
负责具体的任务执行,和对应任务,在每个节点上的资源申请与管理。
TaskManager从JobManager接收并部署任务,然后使用slot资源来启动task,建立数据库网络的链接,接收数据并开始做数据处理。
TaskManager之间的数据交互都是通过数据流的方式进行的。
1.4 Slot
Slot是TaskManager的资源粒度划分
每个TaskManager 像一个容器,包含一个多个slot,每个slot都有自己独立的内存,所有slot平均分配整个TaskManager 的内存。
另外,slot只划分内存,不涉及cpu的划分,CPU是共享使用的。
一个slot会运行多个任务,每个任务以单独的线程执行。
采用slot设计的优势:
1.5 task
是在算子的子任务进行链化之后形成的。
一个作业中的task数量,和作业中算子的并行度和链化的策略有关。