00:00
我们来看一看一个具体的事例,当前的这个事例呢,是我们一看这个非常明显啊,有三个task manager,然后呢,每个task manager里边,诶定义的大家看配置文件里边给的这个是number of task slots是三,对吧,所以总共我们三三得九,一共有九个可用的slot,这是当前资源的一个数量,当然了,这里边推荐大家的配置是你按照当前机器啊,Task manager机器的CPU核心数来做一个设置啊,这里边我们给的是三啊,尽管有点奇怪啊,但是我们知道什么意思就可以了。然后接下来我们就来了一个任务啊,比方说我们写了一个类似于work count啊这样的一个任务啊呃,那接下来它里边的操作是什么呢?跟我们那边定义的差不多,主要就是首先哎,Source读进来,然后做map转换对吧?Flat map,然后map后面呢,有一个sum操作,哎,这里边是用了一个reduce,大家知道这个reduce做聚合嘛,其实差不多的含义啊。
01:00
后面再做一个输出,再做一个think,这其实就是简单来讲,最后我们就包成了这样的三个任务,然后接下来呢,如果说大家想我们默认情况下什么并行度都不设置,默认情况下是不是用的是啊,就是假如说代码里边也没有对吧,提交的时候也没有并行度设置,那用的就是集群配置文件里边定义的那个parallelism.default那这里边的这个default我默认是一嘛,所以大家看每个任务都只有一个,那最后我们的利用就是真正运行的情形是什么样的呢?啊,大家看到因为有slot共享,所以最后运行的情形是只占用了一个slot,那所有的这个任务都挤在一起了。所以我们会感觉,诶这个情况相当于这个资源利用不充分嘛,对吧,那大多数的这个slo根本没有用起来啊,那我们接下来就可以把并行度调高,这样的话啊,你就可以占用更多的slot去做并行处理了,那这里边我们调高的时候呢,并行度设置有几种不同的方法,还是之前给大家已经提到的,首先你可以更改我们默认的那个并行度,对吧,配置文件里边parallelism默认并行度改成二,或者呢,我们在提交这个drop的时候,哎,你执行那个flink drop的时候,可以给一个杠P参数设成二,这个也是可以的,或者在那个web UI界面上一样的原理啊,这是另外一种情况,然后最后还有一种是我可以直接在代码里面设置啊,当然代码里面还有两种情况,大家知道我可以在全局去设置一个env,去设置一个并行度,还可以对每一个每一步操作设置单独的并行度,对吧?啊,这个就是都是可以去做设置。
02:47
那这里边它的优先级是什么?大家还记得吧,优先级是这个从下到上,或者说我们说这个从小到大,呃,这个是优先级越来越低,对不对,就是范围越小优先级越高嘛,啊就是如果说我们代码里面定义的话,它会覆盖掉所有的那些默认配置,如果它没定义,那我们用提交时候给的那个杠屁参数,如果这个也没给,那用集群的那个默认频,注意这是我们生产环境集群里边的默认密行度,如果是在开发环境,大家如果是idea里边执行的时候,大家还记得那个默认密行度,那就是当前运行机器的核心数量,对吧?啊,这个其实是比较简单的一个处理操作,那这里你如果要设并就是二的话,那来看每一个任务就都有了一个孪生兄弟,是吧,就变成两个并行子任务了,然后这六个任务分配在几个slot上呢?还是三个任务可以共享一个slot,对吧?
03:47
前后发生的任务可以共享slot,然后就相当于只是占用了两个slot,就是当前最大的那个并行度啊,所以你看我们如果统一设置的话,那当前最大的并行度不就是它吗?这也就是我们所说的整个流处理程序的并行度对吧?统一设置的并行度,那我们会看到这个并行路设二,它其实资源的利用率还不是很高啊,这里边你还控制这么多呢,哎,那如果要是想占这个资源的利用率更高,那怎么配?非常简单,配成九不就完了吗?啊对吧?所以你如果要是直接把这个并行度设成九,那真的就一字排开,所有的九个slot里边都满满的排满了每一个任务,对吧?因为你全局并行都是九嘛,那每一个任务都有九个,然后又可以共享资源,呃,共享slot资源,所以最后就是27个任务,然后呃,每三个可以共享一个slot,最后还是九个slot把它搞定了。
04:46
这就充分利用了资源,但是在有一些场景下,我们知道就是比方说像这个thinkk,假如说我们不是打印输出,我们是用了一个right还CSV,对吧,我们要去这个做一个文件输出,大家一看这个名字就知道它是要干什么啊,写到一个CSV文件里边,你如果要是要把它写到文件里的话,那就会出现一个问题,你如果这里边并行去执行,去写入这个文件的话,那是不是我们这个就就会有问题了,对吧?有可能有就有写入冲突啊,那这东西怎么办呢?哎,在这种场景下,有时候我们基于这个业务逻辑的要求,就可能要把某一些任务的并行度调成一啊,或者说调低,或者说调成一,这里边我们就直接调成一,最后的效果就是前面的两个任务。
05:34
每个都有并行的九个任务,对吧,那这是18个,然后再加上think呢,只有一个任务,这样的话总共是19个任务。分配的时候呢,还是可以slot共享,所以最后还是占用九个slot,但是think任务只在一个lo slot里边出现,只有这么一个,所以大家就会发现所有的任务这里,你做完这个reduce之后,最后怎么样都要传输到这里边这个TASK3的这个slot上上来传到这个S任务里边,让他去做输出。
06:08
啊,这就是这个例子里边具体分配啊,具体做这个任务调度的一个过程。
我来说两句