00:00
啊,这个完整的流程其实跟批处理非常的类似,接下来我们运行一下,看看执行的结果是不是也是一样的。我们可以看到这里执行的结果跟之前的批处理略有不同,批处理那里输出的结果就是一个简单的括号,然后二元组啊,四个word,然后对应的数字统计出来就就完事了,非常的简单。而我们这里呢,首先每一个对应的数据啊,它是逐渐变化的,我们可以看到它依次叠加的过程,那大家可能会想到为什么我们在处理的过程当中是要先输出哈一。然后hello喽二再HELLO3呢,那就是因为我们这里的数据是一条一条来的嘛,来了之后,那当然哈是先统计出来,它到了一,然后呢,再来一个hello的时候,发现叠加之后变成二了,所以更新之前的统计结果,现在哈是二,那最终再来一个之后,我们发现HELLO3啊,所以最后这一个文档,这个文件里边hello总共有三个,所以最后的结果跟批处理的结果是一样的。
01:14
那只不过在这个过程当中,我们还可以看到它逐渐更新,逐渐变化的过程,这就是流处理跟批处理最大的不同,那另外呢,我们会发现当前它并不是按照顺序,一开始我们先给的这个数据是。Hello word那哈并没有先输出,而是先把word和Java先输出了,他为什么没按顺序来呢?呃,然后另外就是我们输出的这个二元组前面还有一个数字加了一个小键括号,这又代表什么含义呢?哎,这个我们可以先给大家做一个简单的解释,因为我们知道flink本身是一个大数据的处理引擎,那大数据处理的数据非常的海量,它当然不可能只是一个单线程本地直接执行就完事了。
02:06
那当然就应该是一个分布式的架构,所以我们当前的程序如果真正要运行的话,它并不是直接按照我们这个代码里面写的啊,每一步操作,然后在在本地一步一步执行下来就完事了,它应该是一个分布式的执行程序。那么对于开发环境而言,我们当前跑这个代码的时候,Idea尔是怎么去做操作的呢?它其实是用了多线程来模拟了一个flink集群。来跑运行我们这一个并行并行的任务啊,去进行分布式的执行,所以我们这里边结果前面的这个数字,它其实就代表了我们当前是以本地的哪个线程来执行我们这个最终统计结果的输出这个任务的。
03:00
啊,那某种意义上来讲,这就对应着弗林运行时候,它占据的那个并行的资源。呃,在flink里边管这个最小的资源单位叫做任务槽task slot这个概念我们会在后边的第四章再做一个详细的讲解啊,那这样一看的话。自然就想到了前面我们提到这个顺序打乱的问题也就解决了,既然它是多线程并行嘛,那并行输出的话,我当然就不能确定保证先输入的第一个hello word一定是后面先输出啊,因为后面完全并行之后,那有可能。后输入的啊,后面处理的快,直接就先输出了啊,所以这个就完全可以解释我们输出的这样一个结果,那另外大家可以看到我这里边输出的结果啊,九三五十三五。这里边数字看起来没有任何的规律啊,那它到底有没有什么限制呢?
04:03
是有限制的,这里输出的这个编号其实就指代的是我们当前本地执行的并行子任务的编号,那这个并行子任务到底有多少个,它取决于什么呢?取决于当前的并行度啊,这里提到了一个并行度的概念,这也是第四章当中我们讲运行式架构的时候,会详细展开做讲解,这里可以先有一个简单的理解,就是并行度就是当前这个任务分成多少份去做多线程并行处理的它的程度,它的个数。那么当前我们在idea里边执行的时候,它到底并行度是多少呢?我们这里边没有设置并行度,那么默认情况下就是当前运行电脑的CPU核心数量啊,所以我当前的这个电脑是16核,所以当前的这一个数字,它出现的数字就只会是一到16,这16个数,当然具体是哪个的话,这个就比较随机,没有具体的规律了,如果大家自己执行运行的电脑。
05:12
比方说是四盒的话,那么这里出现只会出现一到四四个数字。那如果要是八核的话,就是一到八四个数字了,另外这里还有一个小规律,小规律的话,那就是看到这个每一个单词啊,Word Java flink哈,他们对应的这一个并行子任务的编号是不一样的,而对于哈本身输出的。结果,HELLO1 hello2 hello三都是五这个编号的子任务来输出的。啊,其实这个仔细一想的话也会比较好理解,就是我们当前不是要统计所有的哈罗的数量吗?那前面我们做分组,然后做计算,分组的时候当然应该把同一组的所有数据都分配到同一个并行的子任务上去。
06:01
因为我们会想到,如果你还要把它拆开分配到不同的子任务上去的话,那后边我怎么能在之前HELLO1的基础上再去叠加来来一个新的hello之后把它叠加成HELLO2呢?我就不知道别的统计了多少了,哎,所以这样的话就没有办法全部叠加了。只有在同一个任务上才能够对它进行叠加。啊,这是前面我们从一个有界的。流式处理workout程序里边能够看到它跟批处理到底有哪些不同,而且也提到了一些运行式架构里边的重要概念。
我来说两句