00:00
刚才提到了,如果把数据量减少的话,它可以提高我们的性能,对不对,那还有别的方式可以提高性能吗?这个呢,我们给大家再说一说啊,咱们再来看一看,所以啊,咱们在这个往下啊,咱们往下咱们专门给大家去讲一下咱们的这个沙uffle,好吧,那这个沙Le呢,比方说咱们假设啊,同学们来,咱们假设我现在有一个CU盒啊,一个我们的CPU盒放到这儿了啊,然后呢,我放到这里,好,我现在呢,有一个我们的task。呃,这个task呢,我在这里面干嘛呢?准备要去,诶生成我们的文件干嘛呢?去往下游呢,去传数据,所以啊,这是我们的一个task对吧?诶,我们的一个task现在呢,他要写磁盘了,所以我们这里呢,给一个普通的一个颜色就可以了啊诶,那我下面呢,会有什么呢?三个分区,其实说白了就是有三个task来读数据,所以呢,我们这里呢,拿过来,然后再给它拿过来放这边放过来以后呢,这个我们用一个我们的嗯,红色啊,然后呢,这边用一个黄色,然后呢,这边给一个绿色,对吧,我们红绿灯的颜色啊,放过来。
01:06
好了,放过来以后就意味着我现在有一个盒,然后呢,有一个task,现在里面的数据呢,被这三个分区的数据呢所要去共享了,那我们说了要写磁盘了,对不对?那好,那如果写磁盘的话,我该怎么写呢?诶老师那简单的你就写一个文件当中不就行了吗?所以啊,我现在咱们比方说我就写入到一个文件当中,你放过来的话,同学看我写上一个什么呢?咱们叫做file对不对,然后呢,在我的这个地方,我们的箭头就指向它。我的task呢,就可以写文件了啊OK,那你写文件的情况下,同学们想一想吧,那你这个所有的数据都写在一份文件当中,那么你的下游的三个他该怎么去读它呀,那你三个是不是应该同时就读这个文件呢?所以说诶一个写我们三个读是不是这个意思啊,同学们,哎,就这个意思啊,那我现在呢,把这个呢给它放过来,同样道理,把这个放过来,你们觉得怎么样啊?
02:03
你们觉得有没有什么问题啊,同学们?你们是不是会发现这种方式是不太好的,因为你的task写文件的时候,我们的这几个task他知道我该从哪读吗?他不知道就意味着这个数据是混在一块儿的,那么我们下游的task是很难知道我该从一个文件中读哪一块儿,而且他们同时去读的话,是不是容易造成数据混乱呢?有可能会出现这种情况啊,所以说这种思路并不好,那我该怎么办呀?那我们刚才说过了,因为你在当前一个task给三个task输入数据的话,那么你写一个文件会感觉不好,那我们就会直观的去想啊,如果我们现在是一个task,我生成三份文件是不是就好很多呢?所以腾看我的基本思路就是这样的来拷贝,拷贝以后我们往下走。往下走,往下走以后我干什么呢?咱们这样同不彤,我现在不是一份文件了,来诶把它变小,变小了以后干嘛呢?给它标识上红色,诶标识上红色,然后呢,再来我们给它标识一下,咱们这个写个黄色啊,咱们的黄色,然后再来我们给它一个绿色啊,咱们给他一个绿色放过来以后,同学们看一下,就意味着我现在呀,咱们的这个task可能诶就准备呢,生成我们的什么三份文件,所以呢,把这个呢拿过来啊,咱们的三份文件,然后把这个我们放到这边啊三份文件,那如果是我们三份文件的情况下,大家想想那是不是就方便了很多,为什么?因为我们的这个地方可以读它,然后呢,咱们的这个可以读它,我们黄色的可以读它,对不对,同学们。
03:41
所以这样的话不就解决了吗?我一个task把他们的数据写入三份不同的文件,我们下游的task去读取数据非常的方便,没问题吧,同学们这个思路我觉得非常好啊,为什么呢?互相不影响吗?但是。你这个东西它非常的好,可是有额外的问题什么呀。
04:03
我就只有一个task吗?如果万一我这个,诶,我们的计算当中还有另外一个task怎么办?比方说我还有个task怎么办,对不对,那这时候是不是也要三份文件我们上来啊,咱们复制一下,复制以后放过来,放过来以后来啊。你放过来以后,同学们看一下,那我这个地方是不是应该箭头就指向这里啦,然后呢,我们的箭头就指向诶这里了,对不对,诶放过来同样道理,我们这个地方呢,放到这儿,然后呢,给它放到这里对不对?所以啊,我们现在是这样子的,但是我还是那句话,难道我们只有一个核吗?啊,有没有可能有多个核啊,所以我们拷贝拷贝以后来我们假设有多个核怎么办?如果有多个核的话,那是不是我的箭头我们要放到这边,我们的箭头要放到这边呀?诶就是这样啊好,那么我们这边同样道理来拷贝,拷贝以后你会发现这根线是越来又越多,越来越乱呢,诶有没有发现这个问题,好,那就说明了什么现象啊,是不是小文件过多呀?啊,同学们能不能明白小文件过多,那么会导致我们的性能急剧下降吧,这个大家学我们的海豆的时候,是不是应该学过这个东西啊,对不对,你看线很乱吗?很乱,小文件很多。
05:22
诶就是这个意思,所以啊,这就是我们当前的问题,那当前问题就是我们上面这个方式呀,不方便,下面这个方式它方便,可是当我的任务过多,当我们的核数过多,你的小文件就过多,性能也会受到极大的影响,诶那我在当前场合下,有没有方式去优化它呢?我会发现咱们这两个task是在一个核当中,那如果我们这一个盒不要生成太多的文件行不行呢?所以啊,咱们的思路呢,稍微有点变化来。拷贝,拷贝以后咱们往下走,同学们咱们往下啊来,往下走以后,咱们看这个地方啊来,那么大家可以看到我说过了,咱们既然是一个核,那么是多个task和就跟我们讲那个广播变量一样,咱们广播变量当中是不是就可以生成一份变量,那咱们这个文件也能不能这样呢?就意味着我不要准备这么多,我们干嘛呢?就是我们的绿色,黄色和红色,咱们能不能就这样做呢?那如果这样做的话,那是不是意味着我们的红色给他,我们的黄色给它,我们的绿色给他呢?然后这个箭头我们指向他是不是就可以了,那么同样道理,咱们这个呢,也就不要了,对吧?咱们这个绿色就不要了啊,它咱们不要了,黄色咱们也不要了,把这个黄色咱们指向这个位置,那么这样的话,咱们这边其实是不是一样的,同学们把这个去掉,去掉以后把这个呢,给它来复制一下,复制复制以后放到我们的这个位置,放完了以后,那我们多余的东西,我们。
06:55
也不要了啊,来把这个放到这儿,把这个绿色,哎,嗯,行去掉吧,嗯,去掉以后这个去掉,然后呢,我们的,嗯,OK,大家可以到现在这个这个图形是不是就简化了很多,而且我们的红色连红色的文件,黄色连黄色文件是不是感觉就好了很多,这是不是要比之前的这个要性能高啊,为什么呢,文件数少啊,诶所以这种方式是一种优化。
07:21
它在之前的基础之上,它一个和它这里面呢,会有什么呢?三份文件,然后呢,我的task来写磁盘,来磁盘以后呢,给它合并起来,然后呢在task去读取,这不挺好吗?对不对,哎,这是可以的。那这个有没有什么问题呢?这个也有问题,为什么呢?因为咱们现在看着好像是不多,但是其实啊,我们是为了掩饰给大家看的不多,在我们的工作当中,难道我们的task只有三个吗?我们的下游的那个分区数量只有三个吗?不是你为了并行计算,你的下游数量可能好几百对不对,有没有可能也有可能啊,或者好几千也有可能啊,然后呢,我们上面难道只有一个核吗?大家想想,如果咱们不说别的,如果现在有两两百个分区,如果有200个分区的话,你的这个地方是什么?诶,100个核。
08:13
200个分区100个盒行不行?可以吧,那100个和每个核是200个分区的文件,那你要乘以100,是不是2万个文件?大家想想这个单位可不小,2万个文件呀,所以你看着我画这个图比较简单,但是你真正想起来你会发现哟。文件不少啊,小文件其实也依然过多,所以啊,这个依然有问题,那该怎么办呢?那你不能说我们就成一个文件,一个文件不就成这个样子,那就是那不行啊,你现在最多就是你现在极限情况下不就三个文件吗?其实啊,它还是有优化的情况的,那么我们优化以后变成什么样子呢?告诉大家,其实优化以后就变成咱们的这个样子啊,就是它。好好拷贝,也就是说我们还能够优化,那么但是优化呢,就变成了我们现在的最开始的情况,诶回到最初了啊,什么意思呀,怎么回到原点了呢?回到最初了呢?这不就是我们的file吗?对不对,那为什么就是这样呢?首先我们的极限情况下,大家想想是不是文件越少性能越高对吧?你一写磁盘的文件越少,肯定性能越高啊,所以咱们现在就一个文件,那肯定性能高对不对?
09:24
可是你一个文件我怎么读不知道,诶,那我想办法让他读不就完了吗?所以大家看啊,我能我把一个文件咱们这么做来他们看。我给他一个红色,然后呢,再来,诶咱们给他放过来,然后干嘛呢,写上一个啊,咱们的一个我们的黄色,然后呢,再来给他一个什么呢?给他一个绿色,给他一个绿色放到这边好,然后呢,比方说后面又是一个我们的黄色啊,咱们的黄色诶或者说我们的红色都可以啊,哎,放到这儿,所以啊,这个就是我们的文件,下面呢,我们就不要了啊,下面这个呢,就不要了,把这个去掉,嗯,好,然后这个呢,我们也去掉,就是一份完整的文件呢,咱们分成几段。
10:03
那么这样的话呢,我们就知道哦,我的task它会读哪几段就行了。比方说绿色它读这。我们的这个黄色呢,它就读我们的这边对吧?哎,就这样互相不影响,而我们的红色呢,它就读这一块,然后呢,再可以读另外一块,可不可以啊,同学们可以吧,诶就这样的,所以说这样的话去读不就完成了吗?你这样的话不就是OK的吗?可是问题来了呀,我们的红色他怎么知道这个文件中这两段是他的呢?我们怎么知道绿色该读他呢,对不对?所以在这种情况下,除了我们的文件以外,其实还应该加上另外一个什么东西啊,叫索引。那所以我们这其实还应该再来一个啊,咱们来一个,咱们给它换一个啊,换一个颜色,换一个,嗯嗯,看看啊,换一个绿色还是这个颜色吧,我们写上啊,咱们写上咱们叫做什么呢?叫做index啊,Index叫做索引文件,你把这个索引文件呢,给它准备好啊,索引文件里面就告诉我,诶红色在哪哪哪偏移量是多少,然后黄色的偏移量是多少,它的长度是多少,我们的绿色的偏移量是多少,我们的长度是多少,那么这样的话,大家想想那是不是就好很多,我们红色只要先干嘛呀,先找索引啊,找到我的位置,我们再去读它是不就可以了,同样道理,我们的task它也可以先根据我们的索引,大家看一下,先根据索引,然后知道我们去哪读,是不是也就读到了,那么同样道理,我们绿色是不是也是一样的呀,诶都是一样的,所以在这种情况下,我们的性能就得到了提高,最起码别的不说,文件它就一份啊,哪怕你这边是不是有。
11:42
多个task是不是也可以就一份啊,诶就是这样,所以来我们这边给他放过来啊,放过来,嗯,放这边,嗯,好放到咱们的这个位置,所以最终啊,我们的task只要读一份文件就够了,同样道理,其实如果是多个核的话,跟这个思路是完全相同,没有任何的区别,这种情况下应该是效率最快的,对不对?所以这个叫索引文件,这个就叫数据文件。
12:09
大家有没有感觉跟那个卡夫卡的分段日志非常的类似呀,诶,大同小异,好了,这个咱们先说到这里啊。
我来说两句