00:00
那接下来我们来深入的讲解一下flink的运行时架构,那这一部分内容呢,主要讲的就是flink运行时的系统架构,还有呢,了解一下NK的作业提交流程,另外专门讲解一些重要概念,好,那首先我们先看一下flink系统架构。这个图啊,看着很复杂,其实就跟我们之前一开始在这个部署提交的时候啊,给大家看到那个图是一样的,它表示什么呢?就是这边这里啊,其实就是一个客户端嘛,不就是一个client吗?当然这不是客户端啊,这里就是一个flink程序到这个客户端,然后去做转换的一个过程,我们的程序本身是先要经过这个优化器和这个图的构建器得到一个数据流图。然后在客户端这里啊,做这样的一个转换之后,把这个数据流图去提交给job manager,所以这就是我们任务提交的一个过程。
01:00
大家知道提交之后,目前的这个任务其实就啊,就相当于这个客户端的任务就已经完成了,当然了我们还可以保持的这样一个通信,它主要就是获取照manager那边的一些状态更新和计算结果了啊,你就看看当前这个运行是不是报错了,是不是有其他的一些状态啊,这个都是客户端可以获得的信息,但是任务的执行其实跟他就已经没有关系了。那提交给job manager之后,Draw manager又做什么事情呢?他会把当前得到的分析出来的这个数据流图啊,就是我们从这个原始代码得到的那个,呃,就是数据,数据流图会转化成一个作业嘛,我们把这个提交,所以他会把这个所谓的作业。我们可以把它叫做作业图,然后再做一个详细的分析和转化,转换成一个最终可以执行的叫做执行图的一个东西。那这个可执行的东西呢,就会分发给。
02:01
所有的worker,也就是task manager啊,所以job manager job manager这里边有它自己的这个通信系统,它跟这个所有的task manager去做通信,另外呢,它这里边干什么呢?做作业的调度和检查点的协调,前面我们讲到的那个checkpoint啊,它它是由这个job manager来做这个协调的。那把对应的这个作业所有的任务都分发下去之后啊,那所有的事情就由worker来做了,所有的task manager,它这里边把所有的这个任务拆分开,放到对应的task slot上去做执行啊,这里大家看这个所谓的任务槽task slot其实就是执行一个任务的所需的最小的一块资源。这一部分资源上面就可以执行一个单独的任务。所以不同的task manager上有多个slot,那么就可以并行执行多个任务,在执行的过程当中呢,他们彼此之间也可以有数据的交换,所以数据流其实就是在task manager之间去做流动。
03:12
每一个task manager当然也会有内存,还有IO的管理器,还有网络的管理器,因为它要做网络通信啊,所以这些组件都是需要的啊,在这同时,他们在做这个操作执行任务的过程当中,还会跟赵有所交互,他会给赵manager发送对应的心跳信息,还有发。返回自己当前的状态,以及一些一些啊统计指标的监控信息,那drop manager呢,可以向task manager发送一些部署的命令,停止或者检触发检查点的这样的一些命令,像我们点一个这个cancel,对吧,停止一个作业,那那是什么呢?那其实从客户端或者说我们的这个外部web UI啊接口那里提交了一个指令过来,交给了job manager,然后job manager再向所有的task manager去做通知,取消当前的task。
04:09
它是这样的一个过程。所以这就是整体的系统架构。呃,那接下来大家就会发现啊,就是对于对于这一个,呃,弗林可而言,其实这个客户端理论上来讲,它并不是我们。运行时处理系统的一部分啊,它其实只是起了一个提交作业的这样的一个作用啊,它只是一个接口而已,那真正意义上对于flink而言,它系统的组成成分主要就是job manager和task manager。那接下来我们就分别来介绍一下啊,这个job manager和task manager到底是干啥的?那呃,照manager呢,其实是当前flink集群里边控制。应用程序执行做这个任务管理和调度的核心啊,它是控制程序执行的主进程,也就是说每一个应用程序,它其实就是由唯一的job manager来管理控制来执行的啊,当然在高可用啊,就是ha的场景下呢,可能会有多个drive manager,但是同一时间应该只有一个是正在运行的那个leader对吧?领导节点,其他都是备用的吧?
05:27
这是大家非常熟悉的这个概念啊,那job manager里边又包含三个。核心的组件啊,那其中最重要的就是所谓的job master。John master这个呃,这个组件呢,在早期的flink版本里边,其实啊,没有这样一个概念,早期版本里边它是呃,就是所谓的那个job manager,其实就是这里的job master,也就是说控制当前作业调度的那个核心组件,就叫做以前就叫job manager manager,现在呢是把它叫做master。
06:02
那drop主要用来干什么呢?主要就是负责处理单独的一个drop。也就是说在一个专门呃。Job manager里边啊,这个job master,它其实是跟JOB11对应的。一个job对应一个job master啊,可以有多个job master对吧?啊可以有有不同的这个job master,那在作业提交的时候呢。Job master,他首先会先接收到要执行的那个应用程序。这个应用程序就是从这个客户端提交来的啦,包括什么呢?诶包括抓包以及客户端经过转换处理之后得到的数据流图和作业图,诶作业图其实就是提取出我们到底要执行哪些作业,就客户端其实是把这个东西已经做好的呢啊,然后做master就会把这个作业图drop graph。再进行一个转换,转换成一个物理层面可以执行的数据流图,这个图呢被叫做execution graph执行图。
07:08
这个执行图就包含了所有可以并发执行,你的有多少个并行度,大家看到那个并行度的概念对吧?那我就把它分配成几个不同的实例,分配到多少个这个task manager的slot上面去,所以它就包含了所有可以并发执行的任务。那么。Job master会把任务向task manager去做,发送它同时还会向资源管理器resource manager发出请求,申请执行任务所需要的那些资源,那如果说他资源是足够的啊,能拿到足够的资源,那他就把这个执行图分发给他manager,你们就开始干活吧,就开始执行吧,如果要资源不够啊,那没什么好说的,那要不就等待,要不就直接挂了,对吧?啊,就就报错了吧。那在运行的过程当中呢,壮manager也是还要负责一些其他的调度的,这个中央协调的工作的,比如最重要的就是检查点,就是我们说的啊,你要不定就是定期的要去做一个存盘保存,防止我们发生故障之后,呃,那个所有的那个状态丢失掉,所以。
08:15
这个检查点的触发协调是由John master来负责。那除了job master之外,在这里边我们会发现它跟谁会有交互呢?它跟resource manager有交互对吧?诶,所以在job manager作业管理器里边还有另外一个组件就是。资源管理器resource。啊,Resource manager,它顾名思义嘛,就是负责资源的分配和管理了,在一个集群里边,Link集群里边只有一个啊,那所以呃,它其实主要就是管理整个当前集群里边的资源,所谓的资源呢,其实就是指任务槽,就是task manager,那个task slot,前面我们也已经说了,它slots就相当于是能够执行并行执行任务的一个最小化的资源集合,哎,那所以resource manager分配什么呢?分配的就是slots。
09:08
啊,那所以这个任务槽slot啊,它其实包含的就是机器用来执行计算的一组CPU和内存资源的集合,在实际应用的过程当中,其实它对这个资源是有所隔离的,它的隔离主要隔离的是内存啊,因为大家知道CPU其实是可以分时复用的嘛,啊,这个没有办法去隔离啊,它主要是内存完全分开。每一个并行的任务。都会分配到一个slot上去做执行啊,这就是资源和任务啊,Slot他们之间的这样的一个关系。除此之外呢,呃,这个。Job my manager里边还有一个组件叫做分发器dispat dispa这个其实是可有可无啊,它主要用来它负责的就是提供一个rest接口,包括我们的那个web UI也是由他来启动的啊,所以大家会发现它其实就是客户端向向这个job manager去提交作业的时候,负责一个接口通信的一个一个组件啊啊,那所以当前的这一个dispature在有一些场景下,比方说跟一些资源管理平台集成起来之后,有可能就不需要这个组件了啊,因为资源管理平台可以接收当前的这个作业的提交嘛,啊,那所以它并不是特别的重要啊。
10:31
需要跟大家说的是,在早期的flink版本里边啊,这三大组件其实是分开的。啊,就是我们说这个最核心的job man job master,以前就叫job manager,所以他是。弗,Link里边有四大组件,就是job manager,然后resource manager dispat,然后还有task manager,它们是并列的,现在呢,就是把这三个组件,因为大家会发现他们好像都跟当前的这个集群有关,对吧?赵manager不是一个集群里边只有一个吗?哎,那所以。
11:06
那就相当于它只是这个集群唯一的,那我都把它叫做一个这个job manager就完了。在一个job manager里边,对于作业单独起控制调度作用的叫做John master,而另外呢是资源管理器resource manager和分发器。这就是照manager的概念啊。然后另外还有就是task manager了,Task manager我们都知道他其实就是干活的人,Flink里边的工作进程。那么对于这个flink而言,一般情况下job manager只有一个,而task manager呢,一般会有多个,因为你如果干活的人只有一个的话,这不就是单节点吗?那你何必要集群呢啊,所以一般都有多台机器啊,多台这个task manager,然后每一个task manager都可以包含一定数量的任务槽,就是所谓的这个task slots。它是个slots,大家可以认为就是。
12:03
我们所说的这个能够并行执行任务的资源,所以一个task manager有多少插槽,这就决定了task manager能够一个task manager能够同时并行。执行多少任务,就相当于多线程,它能同时执行几个线程啊,就是这样的一个概念。那在执行这个启动和提交任务的过程当中,它是怎么样,有什么样的行为呢?啊启动之后。Task manager会向resource manager,就是资源管理器去注册自己的插槽,为什么要注册呢?这是当前的可用资源啊,啊,所以他必须到resource manager那里去做一个报告,然后,呃,如果说报告完毕之后,那resource manager,假如job manager job master那边发出了请求,说我现在有一个新的作业,想要多少多少的资源,那么resource manager就会向task manager发出指令说好,我判断你那边有空闲的资源,你把它提供给当前的这个作业来执行吧。
13:09
那么收到这样一个指令之后,Task manager就会将多个插槽资源提供给job master调用,这样的话就可以分配任务,然后去执行了。那么在执行的过程当中呢,多个task manager之间,他们可以互相去交换数据,数据流可以在它们之间去做传输,那每一个task manager也可以有自己的这个buffer啊,去做这个数据的缓冲。这就是每一个组件他们自己的用途。
我来说两句