00:00
好,接下来我们看一下commander具体的案例需求,那这个案例呢,其实是基于word count的基础上,然后呢,我们要求啊,呃,他在map阶段能够提前进行一个预聚合啊,减少它网络上的一个传输,是这样一个需求,那我们workout的输出案例啊,这个案例啊,它的输入数据是不是就是hello啊,哎,Hello喽,那你们输入任何单词都行,这是输入数据,那我们期望呢,在这个map输出端打印的日志里面能够看到它真正的提前进行聚合了。那比如说啊,我看一下啊,告诉你怎么看。这是我们输入的数据。然后呢,我们期望在map阶段,它就能够提前处理成这个样子。比如说班长,你看123。嗯,班长。还有吗?按这四对吧,哎四,然后你呢一二啊两个,然后好呢是两个啊学学学两个hello喽啊这个HIOOP2个对吧?诶在中间map输出的时候就能够得到这样效果。
01:00
啊,一会儿教大家看这个日志哈,那这个就是maps对应的这个日志,你看在combine阶段,输入进来12个单词,输出去五个怎么算呢。一二三四五六七八九十十一十二十二单词出去之后呢,变成几个了,是五个呀,因为它已经把它进行一个聚合了。就是这样一个操作,好,那下面呢,往下看,那我们怎么来实现啊,首先第一种方案呢,我们可以增加一个work count commander继承reducer。好,那在这里面进行单词的一个汇总就行了呗,这不就统统计单词吗。对吧,来进行Y,把Y流丝进行一个累加吗。啊,第二方案呢,是这个后面啊给大家说啊,先保密啊保密。那我们来实现一下吧。增加一个案例。在原来word的基础上增加,那就是穿那个包。
02:00
把它拿过来,CTRLC。搞定。那这里面我们需要定一个类,对吧?哎,定一个类,那定一个类,这个类名叫word count commander。右键。创建好拿到它,拿到它之后啊,它需要继承的是combineerer com。哎,不是command啊,继承reduce啊。Reduce OK,那继承reduce是这里面它的泛型是什么?对吧,那这个commander它的,呃,继承之后它的KV类型分别是什么。思考一下。那我command在哪里呀?我command是在map鸡的。对吧,那map阶段输出的KV是不是就是你的commander的KV啊,那好,那我map阶段的KV是谁。诶,单词。和这个单词的这个次数是这样吗?对吧,哎,这个,那这是呃,它的KV。
03:06
那接下来我最终输出的仍然是单词,以及单词的次数,OK。那我这里面重写对应的reduce方法。对吧,哎,进行单词的一个累计,你看一下这张图啊,把这个拿过来截一下。我们希望实现的效果就是这样。对你这个单词进行统计,那统计的话定一个变量呗。Some。等于零。那我循环便利这个Y流斯便利他。There for each,拿下。拿下之后这是对应的,是不是所有的这个后面这个值啊,后面这值默认是一一进来都是一一,那我把这个一一加一起,那就是。Sum加等于。Value。OK啊,加在一起,但是你这个value啊,它什么类型,Int类型,那我希望怎么累加点get,哎,这样就能够进行累加了,那我累加完之后,我希望呢,写出那contexttest.right。
04:12
那我write的话,谁为K?单词为K。那么value呢?Y6是你求和之后的值,那求和之后的值我需要进行一个封装,那封装的话呢,我们来一个。Private。Int al v等于。你有一个table。那拿到这个outv之后。点将这个sum set进去。之后拿到。是这样一个操作吧。对吧?哎,这样呢,这个commander就完事了,但是你发现这commander是灰的,那有它跟下面这些代码有关联吗?目前还没有关联,那想让他有关联怎么办?
05:00
复制过来,过来之后来到这儿。怎么办呢?job.set。然后把刚才自己自定义的它放过来。是不是这就OK了啊,这就OK了。那行,那现在我们来试一下啊,我现在输出的是嗯,8888也没问题啊八八,我先这样吧,我先不用这个好吧,哎,我现在不用,不用的话,我输入的是input word。Input word,我看我要不要改一个输入输入的文件啊。找一个input。Input case用这个input word吧,就用它得了啊,就用这个啊,用这个行吧,好吧,把它截出来啊,这是我们输入的文件。我对他求也是一样的啊,像我一样。行,那我现在不加这个,我们自定义这个,我执行一下看看效果。
06:01
好,那那我不加修改的话,那是不是就是一个妥妥恶抗的,我干嘛呢?CTRLC,我把这里面内容打印日志。给它拿出来。创建一个。拿过来之后啊,你看一下这里面的执行情况,目前呢,Come input0 map output0是吧?啊然后map in这些啊,Map out这些,哎,这是输入的相关参数往这一放,那下面干什么事呢?下面啊,我把这个写的打开。打开之后我再次执行。不能八八了,来个九九。对比一下结果啊。好,运行完毕了,运行完毕之后,我们来看一下这块的截图。看看什么区别。这是第一次执行的。
07:02
这面是第一次,这是第二次加了commander之后。然后呢,出去。好,那再往下reduce input变成几了,变成七,那我这里面reduce input啊,这也是七来看这个看suffer啊,Suffer base啊,Suffer by多少。是不是就少了,哎,S就少了啊。那什么原因呢哈,你看我这里面艾特硅谷,艾特硅谷是不是重复的,送送送送有重的,哎常老师常老师有重的,哎是这样的一个效果啊效果。行,那就由原来的你传进来的是88个字节,倒入这里面之后,就变成了121,而且呢,你明显能感觉到它执行的这个combine之后,由原来的十个字节输出去之后变成了七。哎,变声器。这就是运行的一个效果啊,提前进行,那现在呢,你感受的这个,嗯,不是特别大,感觉这个数据量好像没有差太多呀,那如果说我这重复的数据。
08:04
1万以上啊,或者一个亿以上,那么这个效果呢,就会非常明显啊。提前进行final。这是这块,那我再大家思考一下啊,那这个combine我这样去设置。我将啊。job.set。Number reduce task。为的是零。什么意思呢,我让这个reduce阶段没有。那大家觉得我这个combine。他能不能还有效果。我再来一个。要要。会是一个什么结果呢?右键运行。你说没有旅阶段?好执行完了,那我们来看一下这个输出数据对不对啊输出数据。111,目前你看啊,这里面是有变化的,以前这个地方是不是都是R啊,现在变成了M,相当于是用M阶段,用map阶段输出的结果。
09:06
汉纸。是不是也能输出,但是这里面有没有聚合。比如说艾特谷二啊,啊,松鼠二啊,苍老师二啊,有没有没有。那为什么没有呢?回忆一下,你看一下我们这上面这个。谁呢,我给你找一下啊,嗯,沙发机制。沙坡机制这块,现在啊,我们是把整个reduce阶段。整个radio阶段去掉了。如果你radio阶段去掉记住了,那我前面这些什么,三分之后的这些操作都没有,全没有。压根就不会有沙发阶段,因为这个沙风呢,是横跨的map方法输出reduce方法之前是不是这段混洗的过程叫沙风啊?那如果说你连reduce都没有,那就没有沙,直接从这个麦方法就出去了。
10:03
那还有什么,你这commander一点用都没有。能懂吗?哎,所以说没有re计算你就不要设置这个。啊好,这是一个点,那行,那大家现在再来看一个事情。现在呢,我们这里面写了一个嗯,Count commander对吧,你看一下我把这个代码截一下。这行,然后呢,我再来到这个word count reduce。缩小一下。能看清吗?嗯,差不多能看清啊,看一下这是下面的对吧,嗯,然后这一行,然后对应的这个,呃,输入的K正常有吧,嗯,然后下面看。啥意思?啥意思,是不是一模一样啊,你发现这两个一模一样,包括输入的一个key,你看一不一样。一样的,都是一样的。那都是一样的,那我还写一遍干嘛呀。对不对,那这个我我这个command我就不写了,行不行,哎,你看一哈,我这边不写掉,把它注释掉,那这个一给注释掉啊注释掉我现在怎么写呢?我这样去写,我说job.set。
11:11
Commander,我这回不用,我自己自定义的,我用谁呢?我用这个word。然后。哎,我用自己的ER能不能实现同样的效果呢?再来看二二,右键执行。好,执行完毕了,执行完毕之后看一眼commander输入十输出呢七没问题,那没问题,我们来看一下结果。二二了。右键打开。是不是结果是一样啊,哎,结果是一样的,那这个是结果没问题,然后中间呢,这个运行的程序这里面也能够明显看到对应的输入数据。对吧,进行一个在map阶段提前预聚合了啊好,那我们未来怎么写,未来我们要想用这个commander的话,想用是不非常简单啊,哎,首先你要判断一下它是否会影响最终的业务逻辑,只要不影响那就可以用,那可以用的话,我们还用自己去写一个吗?不用,哎,通常呢,我处理办法就很简单,直接在这个。
12:22
驱动里面用你的reducer就可以了,直接把它放过来。哎,一处理这多快呀。这就是commander相关的案例。
我来说两句