00:00
好,接下来呢,我们来看一下commander这个组件啊,讲这个command组件之前呢,我们先来到这个S这块。先回忆一下这个沙哈。打开。哎,前面这块快速过来,到这个地方比是从这个环形缓城区出来。排完序,准备一写的数据,他要进行一次什么呢?可以进行一次,这是一个可选的。那如果进行commander,他会做什么操作?它会将里面比如说你K相同的内容A1。A1。把你K相同的内容进行一次合并,它会给你输出一个A2。实现这个效果,那实现这个效果有什么好处啊。那假如说哈,我们在这个map阶段,A1A1这种数据有遗忘了。那1万亩。如果我不进行这个command处理,那我向reduce端传输的数据是多少?是不是要传输一半?OK,那如果说我在这个map阶段提前进行了一次commander,那我最终输出的是A1万。
01:08
我是不是只需要传递一条数据就够了?直接就节省了1万倍的一个效率,对吧,这个效率就非常高了。啊,还有一点。在大数场景下,Map的个数。相对来说要多一些,Reduce聚合的个数要小一些。还有map阶段,每一个map task,它是不是只处理128兆的数据。128。那reduce呢?他是要把你map阶段所有的数据都汇总过来。进行一个聚合。那你觉得他俩谁处理量处理的大?是不,他会更繁忙一些啊,Map test更轻松一些,那如果map test阶段能帮这个reduce提前处理一部分。那是不是整体的效率就提高了?OK,那基于这种思想,它就会在这个前边可以有选择性的开启这个commander,为什么说叫有选择性的开启呢?是不是所有的MAP6都能开启commander呢?不是。
02:08
是有前提条件的啊,那后面呢,我可以大家看一下什么样的场景能够用commander,什么样的场景不能用commander啊。啊,后面规定规定排序之后,然后这个地方还可以再进行一次commander,再进行一次commander,前提条件是什么,你前面这个一写文件啊有很多。很多,那我第一次进行归并的时候,我没有一次性归并完。你看啊,我我第一次,假如说默认情况下,它一次归并多少呢?一次归并十个。十个一写的文件。啊会并,那你规避完十个,那假如说我这里一写文件有30个。对吧,那我再来十个。然后再来十个归并到一起之后,还剩三个,那对这三个文件,我是不是还得再来一次归并啊,那再归并的时候,那又用到commander啊,它是这个含义。总之让你这个写到磁盘上的这个内容之前,他这里面都已经完了。
03:03
OK吧,好,那先有了这个印象之后,那下面我们来看一下这个,呃,对应的详细说明。第一个ER呢,是MR程序中map和reducer之外的一个组件,它并不是MR程序默认的组件,比如说它可以有可以没有,有的话呢,相当于额外的这种插件。对吧,好往下走。Commander组件副类呢是reducer啊,也就说它呢,第一个类继承的仍然是reducer。好,再来,那commander和reduce他俩到底有什么区别呢?看好了。这是map。对吧?哎,Map里面map方法出来之后形成环形缓冲区,环形缓冲区要溢血之前可以提前进行commander,那它在哪里。是不是在这个map阶段呢,那好,那radio阶段呢,在这。而在这里面,他将多个map test的数据。
04:03
相同的分区拉到这儿。对吧,位置的话,它是在reduce task里面,它是在map里面,那好,那map task有多少个,是不是非常多呀?啊,假如说在生产环境下100个很正常,有100个ma test,那是不是这个commander,它每一个ER只负责合并它单独自己这个map test里面的内容。但是我reduce呢,我是负责你所有map发送过来的数据啊,我拉取过来的数据。对吧,哎,这两个位置是不一样的。好,Commander呢是每一个map test所在节点运行,Reduce呢是全局所有的map test。Command e啊,是对于每一个map test的输出进行局部汇总,那当然了,它只对这一个map里的数据进行汇总,目标呢,是为了减少网络上的传输,由A1对吧,嗯,A1 1万个。传输过来之后,我希望传输的是A1万。
05:02
哎,变成一条。降低网络传输。再有,Commander能够应用的前提是不能影响最终的业务逻辑,这是我之前抛一个伏笔。不是所有的场景都一定能用。那举个例子吧。这是在map阶段,它有两个map test,第一个map里面传输的数据357。第二个卖二六没问题吧,那我想做一个什么事呢?我想算平均值。我希望把所有的数据加在一起,最后算平均值。好,那如果你算这种平均值,你在map阶段提前开启了。会出现什么结果?357加在一起之后,是不是得除以三呢?结果等于五,二和六加在一起,除以二等于四。是这样吗?然后四和五是不是传到六端呢?那四和五传到六端再除以二呗。你四和五加在一起除以二,那是不是就是4.5啊。
06:03
十点啊,这。4.5。那么如果说把这个所有的数据都拷贝到。Reduce完之后再进行算平均值,怎么算?三加五加七加二加六,然后除以五。除以五,那它等于它吗?等于九除以二吗?不等于,哎,也就说算平均值这种啊,它会影响你最终计算的一个结果是坚决不能计算。那什么场景能用这个commander呢?求和呀。求和可以,你看我这里面。MX的求和得多少呢?这是15。下面求和,85加八二十三对吧,23,那我可以先给你来一个15,然后这边来一个八,哎,最终结果呢是23。那或者呢,你直接都拷贝过来到这儿,是不是计算完之后也是23。对吧,啊,所以说呃,Command的前提条件呢,是求这种平均值不行,求和是可以的。
07:01
最终我们的要求呢,是不能影响最终的业务逻辑。那下面呢,我们也可以制定一个commander啊,其实非常简单,只要定义一个类,继承这个radioer就可以了哈。那我们一会儿来案例实操一下。
我来说两句