00:00
那接下来呢,我们再看一下这个所谓的任务调度原理,这里面其实就涉及到了很多任务在具体分配,在执行,在调度过程当中的一些概念和原则啊,那首先我们看一下这张图,这就是一个笼统的概念啊,整个任务调度的时候是什么样的一个状态呢?啊,简单来讲,首先我们写了一个flink。程序啊,一段代码啊,不管你用这个Java写还是skyla写,写出这个代码来之后,其实大家想到。大家回忆一下之前我们写的那个代码,是不是每一步操作都是非常清晰的呀,哎,流失处理嘛,一步一步对吧,每一步任务都非常的明确,所以基于这个代码直接就可以生成一个数据流图data flow。然后基于这个数据流图呢,大家看就是我通过这个client啊,一个客户端把它要提交给提交到当前那个当当前的这个弗link集群嘛,不管是通过这个,呃,比方说雅恩的resource manager,还是说dispat,对吧,STEMSTEM模式下自己的那个Dis dispat,那大家看最终是不是都会给到job manager,那job manager拿到了这样的一个job对应的那些数据流图之后,他就会把这个数据流图做一些分析处理,最后生成一个。
01:19
可执行的执行图对吧,大家还记得这样的一个概念啊,所以大家看这个客户端和这个job manager之间,它的这个数据主要是有哪些交互呢?啊,非常简单,客户端这边其实就是只给他提提供这个就是提交drop啊,Submit啊这样一个作业,或者呢,就是后面我们要取消一个drop的时候,我们也是在那客文客户端上点点点对吧,或者说是这个用一个命令啊flink cancel只需把它取消掉,所以客户端这边就只是发送这些消息。而这个drop manager呢,就给他来返回一些状态的信息和一些结果,对吧?啊,就是一些执行的运行的结果,这就是关于这个前面啊,我们生成这个数据流图,然后提交的过程,然后我们更关心的是当前的这个作业里边所有的任务到底怎么调度。
02:13
那其实简单来讲就是。当前一个作业里边应该有一个job manager,另外还应该有多个task manager,然后每一个task manager呢,里边又可以有多个task slot,对吧?啊,就可以有多个这个插槽,所以最终我这里边job manager分配开的每一个任务,大家看他是不是最终都要执行在。每一个对应的这个slot上面啊,然后接下来大家就会发现,这就相当于是一个多线程执行的过程了啊,每一个任务都并行执行,那是不是我们这就是一个大数据并行处理的一个过程啊,对吧,后面就是这样的一个过程了,那这里边job manager和task manager之间又要交互哪些信息呢?呃,其实主要就是跟这个job manager,像task manager,那是要就是把我们的这个任务要分配下去,要发送过去,另外就是如果说我们这里边取消了这个作业的话,我去停止取消这些。
03:14
任务也是需要照manager发指令的,对吧?啊,这些都是控制类的指令啊,都是照manager来发,还有就是如果我要想触发那个检查点保存的话,要做存盘也得job manager来发指令啊,所以这些都是job manager来做的,那另外这个task manager呢啊,要给这个job job manager发一些,哎,当前我的状态信息,心跳信息对吧,或者说统计统计信息啊,啊这些都是互相之间要做一些交互。那运行的过程当中,我们其实会发现job manager其实就对具体的这个干活的过程不管了,对吧,就是你至至于这个呃,数据怎么来,怎么处理,完全跟drop manager没关系了,所以接下来其实就是数据来了之后,那么当前的它,呃,这个slot上啊运行的这个任务,我接收到数据,那就开始执行,执行完了之后呢,得到的结果。
04:07
是不是一定有一个下游的任务啊,啊,对吧?啊,除非就是你是最后一步,比方说你控制台打印输出,那你就直接输出完了嘛,所以这里面一定有一个执行的流程,所以在这个执行的过程当中,就是每一个任务执行完毕,把数据就向下游去传递啊,那大家看就是task manager之间会有这样的一个数据流动的过程。这就是整个任务调度的原理和它提交运行的一个架构。啊,那大家看到这里面其实就涉及到了一个非常重要的几个问题啊。大家可以先来做一个思考。我们现在flink是一个分布式的大数据处理引擎,一个框架,那我们说既然要做这个分布式架构啊,它其实最关键的我们不是要做这个低延迟高吞吐吗?高吞吐最关键的一个一个要素,其实就是利用分布式架构进行并行计算,对吧?啊大家想一下,现在我们这个到底怎么样做并行计算呢?
05:09
其实这个问题很简单,大家看这里面怎么做并行计算的。对不就是相当于我每一个任务,每一步操作,我都可以给它设一个并行度,然后拆成并行的几个task,几个任务,那这不就相当于并行计算了吗?啊,对吧,简单来讲的话就是设置并行任务对吧,然后分配到不同的slot上,多线程就可以把它执行起来了。这是这个问题的解答,那接下来问题就来了。并行的这个任务到底需要占多少个slot呢?哎,之前大家,呃,通过我们那个测试的例子,大家发现好像啊是我当前这个所有任务里边啊,就是并行度最高的那个,好像就是最后占用的那个slot对吧?啊好像这是我们测试的结果,那问题就来了,为什么我不是所有的任务都单独的放在一个slot里边呢?
06:06
这是这个问题啊,后面我们要解答这个问题,然后另外还有一个问题,就是我们当前一个流处理程序里边到底应该包含多少个任务呢?哎,之前我们想的是你定义的那个代码里边每一步计算操作就应该是一个任务,对吧,但是最后我们发现有些情况下它是不是就合在一起了呀,到底什么场景可以合并,什么场景不能合并呢?哎,所以说这几个任务大家如果,呃,这几个问题大家如果都想清楚的话,那接下来我们其实就把整个过程就串起来了,就是诶,当前我通过这个代码,首先先分析每一步操作是干什么,对吧,然后每一个操作都可以设置一个并行度,然后我一分析之后,我可以知道他们哪些能合并,哪些不合并,我就知道最后一共有多少个任务了。然后有多少个任务,最后是不是我还可以就是分析出来它到底应该占用多少个slot呀,啊对吧,那那接下来他这个分配的时候,我就知道它到底应该分配到多少个slo上,我应该给他多少资源,就可以把它跑起来,然后接下来运行的时候,就是不同的lo之间,不同的它manager之间去交互数据,传输数据就可以了。
07:17
这就是一个完整流程,就可以串起来,所以大家可以把这三个问题做一个细致的思考。
我来说两句