00:00
好,接下来呢,我们准备开启reduce text源码,对吧?哎,那开启之前啊,我们还是再截一张图,还是来到map工作流程,然后把它后半截截出来。把这拿走。那这个位置,嗯,把它放起来吧,先收起来啊,收起来用的时候我们再来看啊,然后仍然回到这个位置,这下面呢,是有对应的这个源码对吧?哎,如果你第一次看的话,你可以照着这个去看啊,没问题啊,啊那我们回来走到这儿之后,首先映入你眼帘的是。上来三个阶段,Copy reduce。熟悉吗?那你看一下你这个这个源码。啊,这地方啊,你对太子工作机制啊。Copy short reduce。对吧,哎,对应的三个阶段,那copy呢,是抓取数据。那salt呢,是抓取过来之后队形进行归并排序,那reduce呢,是后续的一个解除处理,对吧,那这样一个处理,那好,那回来,那进入到这里之后,大家思考一个问题,我这个reduce task有几个?
01:05
有几个radio test?我是不是有五个呀,啊,一定要注意啊,现在是得有五个136137 138139,还有other其他内容是不是在执行五遍呢?好,那我们先来执行的是第一遍啊,第一遍操作啊,别扔混了,我们是要走五个reduce task。你说这东西啊,相当于有五个好。那他有五个,那先进来了之后,哎,一般程序啊,都是要先初始化的,对吧,那上来说初始化三个状态,往下走走走没问题,往下往下好走到这位置打个断点,那这位置呢叫初始化,那你看它初始化什么了哈,那我首先我要一点进入它,先进入它,然后再点击进入进入它,然后之后呢,第三次才会进入到init啊记住啊,那行,我们进入是吧,Get job,然后出来第二次进入进它。我,我防止跑跑偏了哈,我提前打断你。
02:03
对吧,啊,回来回来之后呢,我再次进入,哎,果然啊进来啊进到这儿,那进到这里面他干了什么事呢。进行各种初始化啊,往下看,哎,这个获取当前的状态运行,然后呢是用新API,哎,这个是新旧API的一个兼容性问题,那这里面看一个事儿就行了,那这里面有一个out put of me。默认情况下out put是什么?Out么呢?是test out put对吧?哎,那你看一下是不是。鼠标往这一放,Test out put吧,就看它啊,你看它那行,那看完它之后我们出来哈,出来这个方法出来,出来之后从这继续往下走走走走,哎,继续往下走,往下走走。走哎,往下来到哪个位置呢?来到这个位置提前打断点,这是初始化对吧?哎,那下面上面往下快速走。走到这儿,走到这儿走没问题。没问题,到这儿了啊,到这儿下面的位置我也提前打一哈,那这里面进入到这个初始化,那看他初始化了哪些内容进去,嗯,进来之后往下看。
03:11
往下走走走,那走到这个位置提前打断点,然后呢,如果你这是你对象啊,你还得提前在里面打一个断点。这是最靠谱的啊,好,那往下看看它初始化了什么内容。进进之后进。再点。进进来了,进来之后这里面上来就是get number map task,他为什么要get number map task,而且这MAP1。啥意思?他为什么要get map?那我得我这个reduce task,我要拉取数据,我得知道我从哪一个map test拉呀,它有几个对不对,你这有十个,那我是不是得拉十份,那你有一个,我是不是拉一个,哎,所以说这地方首先是获取到它的个数,哎,然后这边来拉。好。那有同学说有没有这种差异的,说海哥你就一个一个ma task,你准备了两个radio task,这能工作吗?
04:06
有影响吗?没影响,Reduce他是不是拉取指定自己分区的数据就行了,对吧,我从这拉你拉你的没问题吧,嗯,好。嗯,这是第一个小事儿啊,往下看到这那看完了新债re test是一,那这个方法呢,就已经结束了,结束它的使命,退出,嗯,回来回来之后往下看这个地方有一个create manager。那这里呢,还得继续往下进啊。嗯,走到这个位置啊,进去啊进去看进去看呢哈,这里面还是又一个墨manager死蟹类,先打断点啊,提前打断点,否则他又跑了。对,出来。退出来之后,然后往下走,他先走的,你看先走这个这个这个一个一个方法走啊走走走走进入看来了吧,哎,进来了,进来之后呢,往下看看他干什么事儿了。这个比较长啊,前面各种初始化。现在呢,一直在处在这个初始化的状态。
05:01
那想你思考问题,他要初始化什么内容呢?我马上要从远程去拉取数据,那我拉取完的数据会放到哪里?之前咱说过,一部分放在内存当中,一部分放在。磁盘上对吧,哎,内存满了就放在磁盘上,那你看这个位置是什么。我是不是准备了一个内存。还准备了一个磁盘。对吧,诶我提前准备好的,诶你看它这个操作流程啊,它是提前准备好之后,然后再去拉取,先把一些初始化工作做好,诶往下看好这个位置就是初始化对应的内存和磁盘。往下看出来。出出来吧,哎,再走,又回到这儿,回到这儿之后下出来。哎,到这个位置,到这个位置之后,这个地方要注意啊,这是一个run方法,那要进入到这个run方法里面去进。啊,进来进来之后新债相当于我的准备工作都已经做好了,那就要开启我的抓取操作,对不对,嗯,Copy吗。
06:05
那你看一下往下看啊,往下有没有啊。这是fetch。嗯,这位置start好,诶打好端点防止他跑了,那往下看下面往下走,现在呢,就开始它的抓取操作,Even fe。那这地方也能体现出来,他不是reduce往我这边推,而是我自己主动的去拉。哎,这个概念有啊,是我去抓,从开始位置抓,那抓那就抓呗。往下走走。慢点啊,这地方不要着急诶到这儿到这儿之后呢,继续往下走,诶到这现在呢,就已经抓取完毕了哈,抓取完毕之后往下看看这个位置。叫copy完成,是不是整个copy阶段就完事了,一共三个阶段嘛,Copy so,还有一个reduce,那好,那走到这个位置之后copy结束。
07:00
那copy结束之后,当前状态立即切成salt阶段好。那你切成salt,那就往下走呗,Salt开始往下走。往下继续。好,出去。再走,哎,Clear,然后呢,你走到这行的时候看到了吗?叫sot阶段结束,哎完成了,哎如果你执行这方法,这些就完成了,哎排完序相当于是底层是调的这个规定啊,那如果说排完序之后,下一步他要进入哪里,是不是就该进入到reduce方法了?那你看一看是不是啊,我提前在这个位置打开断点往下看。进进。进进进,好,进来进来之后呢,我们往里走进进来之后,嗯,往下往下看吧,往下走吧,走到这。继续继续再走。啊。走慢点啊,这地方慢点,在这个位置打断点。走走是不是走到这儿了,哎,走到这之后你看啊,我要进去看好,那现在呢,是这个是谁的,是不是reducer这个方法啊,还记得吧,出手啊,关闭正常的一个reduce聚合操作啊,那往下看进来进来之后进马上要进入到reduce方法了吧,Reduce方法我们有没有提前打断点看一下啊。
08:21
哎,有断点是吧,哎有断点就好。有断点就好,有断点之后,那我就要进入,你看一下子就来到这个位置了,哎,相当有正常reduce方法的一个处理,那处理的话,现在相当于是我其中一个reduce task是不是要准备往出写了,对吧?往出写那好想思考一下,我写的话,我进入到这一个reduce方法里面,是不是都是相同的K啊第一遍。对不对,相同的手机号吧,然后往出写这一行的内容,这个总流量内容,那你看他怎么写的啊,那我进来。走right右right,你看我现在写的手机号呢,就是1363057791,它然后继续往里走,继继续往下。
09:04
下一行来到这里面,哎,要往出写,看看他怎么写的,继续往下找下一行。再轴再找你看他先写的谁,是不是先写的是一个K呀,那怎么写的呢,进。下来下来,走到这儿,调用right方法写。说。剑。出哎,现在再来一次,就是进入到这个right方法对吧,然后我再进入到right方法,我再进入到right再进,然后往下走。往下走,哎,抛出异常好,然后出来出来OKOK。再回来,回来之后上面这个K写完了,写完之后往下走呗,你看怎么写的,再继续这个跳过来啊跳过了,那跳过看这里面吧,这里面也能看进来right object,然后下来,下来之后这里面有right方法进。然后你看这谁还记得吗?熟悉不?B我们自己写的图使运吧,它是不是就按照我们自己定义的格式往出写。
10:03
哎,这个很重要啊,好。那定义完之后,然后。出去对吧,哎,这就正常就写完了哈,那我是不是现在是写完了,相当于是一个K呀。对吧,那我这个map radio test里面是不是有多主key,思考一下是不是有多种key,你看,然后我再走。那他是不是又又来到这里面进行下一组reduce的那个K的一个处理啊好,那下一组K你看又来到这了,那现在这个K变成136828了,对吧,那直到说把这里面的数据处理完就结束了,好,那我全数运行。看我处理完之后,它又回到这儿,这儿是哪儿?刚才是不是radio text1呀,那现在我又回到这,这是是不是radio text2,然后radio text3 radio4radio5,我是不是一共有五个radio task。对吧,那第一个刚才已经完完整整的结束完了,那你下面要执行第二个,那第二个的时候其实过程一样,对吧,你这时候可以全数运行了,比如说诶走到这儿初始化,初始化里面其实就看一下这个output format,它默认的是test output format就可以了呗,那你进去看一眼,对吧,再带你们看一下。
11:16
嗯,然后出来,然后再进去对吧,哎,走到这位置,走到这位置,然后往下看,往下往下,哎主要不就看它吗?对吧,鼠标往这一放对吧,它也是奥曼看完之后立即撤出,撤出之后往下走走走。再走。诶,走到这位置,先到初始化,看它到底初始化了哪些内容,那进去呗,哎进去,那进去再进再进再进再进再进再进,好走到这位置,走到这位置我要进去看一件事,看一件什么事呢?看一件它这个初始化的number map task这个怎么获取的。好,先获取它一看呢,获取呢正好是一个map task,好,那直接退出,那这也看完了,看完之后呢,再往下走,走到这个呢,叫create merge manager对吧,那看他怎么干的,比如说他要还要准备相关的内存和对应的磁盘,那怎么准备的呢,进去。
12:13
进来之后下下下下下下好进来了,进来之后往下走。一直往下。这地方比较长啊,它初始化的东西比较多,前期啊都是大量初始化,写代码比较严谨一些,你看又到这儿了,哎,这个位置初始化呢,主要准备内存和磁盘。出来。好出来,诶,那初始化工作结束之后,立即就进入到run方法里面,那run方法里面其实执行的就是我们对应的抓取数据。对吧,那你看我就抓取数据吧,那抓取那总有结束的时候呗,往下走,正常这个拷贝啊,拷到这的时候正好结束了,那拷贝完之后,那拉过来的数据我得进行干嘛,我得进行排序啊,对吧,进行归并排序往下走。
13:01
拿出来。出来。周周。走到这个位置对吧,哎,这里面其实进行规定排序,排完序之后结束了。那结束之后要进入到哪里,要进入到review方法呀,那再次进入到radio方法,哎,全数运行到这儿,那到这儿你就往里进呗,啊进来进来之后。直到找到它里面的reduce run,看reduce run,那reduce run的话,这里面你可以点击进入对吧,哎,进入这就是系统的那个reduce task,然后下来,然后判断下对吧?哎,这里面我们要进入,嗯,进入进入这是参数,然后输出。第二个还是一个参数吧,那还得再进。啊,再进,然后你再出,那第三次就会进入到这个reduce方法进,你看这不就是我们自己写的reduce吗?啊reduce,那你进入到这个reduce里面之后,那你看往下走这一行下走,然后走到这个位置。走到这走到这儿呢,相当于是你这个分区当中的这是137这个分区对吧,对吧,哎,137啊137,然后往出写,那得有几行是不是写几次啊啊有几行写几次,那行这里面我选中一下啊,这是13729,再来13736。
14:09
再来13768,你看再来出来了啊,137排完了,那排完下一个该谁了?是不是该138了啊,那我全数运行啊,全数运行。看看是不是啊,直接验证结果。到这儿你看138这分区吧,然后执行一下。138就一个啊,又出来了,出来之后这次该139了吧,哎,139往下走。考验手术的时候到了啊,好,139,你看139,然后往下。139139139,哎没了,那剩下的是不是就是其他的了,哎,其他的出来出来。走到这,你看134啊等等,除了135136137,呃,136~139之外的其他的一些内容啊,那后面的我就不再执行了啊,直接输出啊,那这个诶还有一个。
15:04
这是几啊?呃,到教师这边打断点啊,前面一行,我看这这这个事情咱们应该是数差了一个吧。哎呀,结束了啊,差不多啊,就这意思啊,我们这里面啊,一共五个分区,它应该是要执行五遍,这就是整个这个reduce test源码啊。
我来说两句