00:00
好,接下来呢,给大家讲解一下map task和reduce task一个源码解析,那这个源码解析啊,呃,非常重要,对于你理解这个map底层的一个工作原理至关重要,那行,那在讲这个之前,我们先给大家来盯两张图拿出来。Map task。对吧?哎,把这张图拿过来,那下面这张图啊,一会我们讲到这reduce textag的时候再给大家拿出来啊,那我们先来走到这个地方,对吧?哎,下面这里其实有这个正常运行的步骤啊,这个步骤也有啊,如果你是第一遍来学习的话,那建议大家呢,先看一遍这里面流程,然后再执行。那我这里面找一个案例啊,给大家进行一个运行,呃,以前呢,我讲课呢,是用这个word count,现在啊,我升级一下,哎,换成这个partan也是增加分区。对吧,诶加大点难度哈,那这样呢,我们就能看到这个分区里面相关的一些源码。啊,那这个还还记得吗?这个案例,这个案例啊,我们是统计手机号。
01:02
对吧。诶,统一手机号将136开头的放到1361个文件里面,然后137放到另一个138 139以及其他的一共形成几个文件一形成五个文件啊,哎,是这个案例,那我们怎么运行呢?第bug运行一下。来到这里面提前打断点,断点啊,这里面我们在。Map,哎,这个right这个方法,这个地方打个断点,Reduce里面我也提前打一个。我也在这个位置打上一个啊,防止这个过过头哈,接下来回到这之后,我们开始准备运行,检查一下你的输出路径是否存在out put666。找一下。目前一个也没有吧,好,那这一步过了,那再回来准备开始执行。右键。执行。第八个走。好来到这个位置,那现在啊,就相当于我们这个位置对吧,然后下一步我再进入到这个right方法,是不是就进入到这个环形缓冲区了,那看一看是不是这样的。
02:05
那我怎么走呢?点击进入走进来,进来之后进入到right方法继续进,再进,进到这儿还是right,那继续往里面找,哎,进来进来之后熟悉的方法吧,对吧,哎,收集器,Client收集器,然后这里面有一个它的参数,里面有个get part,那我们进去呗,走。进对吧,这是我们自定义的part。进来,那进来之后想进去观看一下,进走到这,这是我们自己写的,往下走,往下走对吧,哎,走。啊,那出去走走。然后我再执行。进入啊,进入看进到哪里了,进入到这个。那collect就是这个环形缓冲区,那环形缓冲区里面做了什么事呢?往下看往下走,哎,前面这些初始化我们不用看,你看写的比较严谨哈,也就说出现问题直接跑一层属于这种。
03:02
那再往下走。往下。往下走好到这儿到这儿之后,你看一下我们这张图当中啊,我们说啊,我们这个数据存储的呢,一部分是原数据,另一部分呢,是实实在在的数据,那原数据当中有partan key star value star,还有个index是吧?哎,那你观察一下这几个值的变化哈,然后右边的这个数据呢,有key有value啊。好,往下,你看这是谁,这叫k star,哎,其实呢,就是环形缓八,环形缓冲区的指针给了K啊K,这时候k star吗?来往下。往下走,然后看一下这个key star啊,它有要求。有什么要求呢?说这个k star,我需要对它进行一个趋化。那为什么这个star要求序列化呀?思考一下,之前咱讲过,说你这个map test有可能在102这台服务器上。那我未来radio有可能在103上。
04:01
那我这个K需要跨节点的一个通讯,那它必须支持虚列化,哎,这就是一个原因啊,好,那继续往下走,嗯,往下看这是序列化,下面再找,哎,Key start完事之后,那接下来就是Y0STAR,哎,继续呢,也必须支持序列化,好。这是看到两个支点了,那再往下走,往下看下下下下。好到这个位置。看一下这位置,这个位置说有k meter。Kiwi,那kwi里面有谁呢?有一个partan partan,有一个kwi start k start,还有一个value start,对吧,那还差一个index,那index就这位置。那你看不就全都对上了吗?啊,往下看呗,往下走走走。是吧,哎,下来了,那后面这个kv index还可以通过公式进行一个计算。OK。那这就写出去一条了吧,诶CONTEXT1条条往上写吗?往下走再出再走对吧?诶你看进入到map方法里面,这一行内容是不是就全完了。
05:09
那就写完了,那写完之后,那接下来是怎么办,接下来是不是写下一行啊,那好,那你看啊往下走。然后走,你看回到哪了,又回到这个map里了吧,哎,继续下进,哎又进来,进来之后诶进。嗯,这个呢,是。出去出去之后下一个进他了吧,进他之后我再进。进完之后我再出去,然后再进。你看又回到对应的这个map方法里面。那时候一行一行读,把你所有的这行内容全都读完呢,哎,那我读多少呢,你看一下你的输入文件。输入文件当中,在这个位置有一个input part floor。这里面。我这个原始数据有多少行呢?一共有22行,那22行的话,我这都加一起能达到环形缓冲区溢出的标准吗?
06:06
它一共是100兆,到达80%都才一写,那我猜猜22条能吗?不能对吧,那不能的话呢,它还有一个处罚条件,就是你所有的文件全读完之后。那我也可以触发一次一些。那好,那这里面我们就快说啊,你看最后两条,什么叫158,嗯幺三,我盯一下吧,盯出来。啊,执行到这个位置的时候,我们要注意一下,现在呢,我们就可以快速的往下走了哈。这个拿走。怎么快手呢,看这位置,现在我处理的是1384544121啊,那我全速运行走139。139182。841135再找159137136150还挺多哈,13560不是134不是136139135182137。
07:04
13568433656,对吧,这是第一次出现,我再来一次,是不是第二次出现,哎,第二次出现好我们进去。进入进入之后继续进入。然后再继续进入。好,来到这位置,来到这个位置呢,我继续进入,进入get爬,然后出来出来之后。进入对吧,你看吧,我又回到了这个环形缓冲区client,那好,那这是最后一遍了啊,最后一遍往下走,看看它出现什么情况。往下走走走。对吧,又执行了这个数据的一个处理,往下往下下面呢,是原数据处理好结束了,结束之后走。走。好,出来又进到这里面啊,那进到这里看一看,他这次还会不会再进入到map方法下面。说不出来了,哎,现在呢,就进入到这个clear up方法了,那clear up里面有内容吗?没有,那没有的话看他怎么处理啊走。
08:05
好,诶。你看跳出来吧,哎跳出来了,跳出来之后往下看,哎往下走,走到什么位置呢?走到这个位置。Close,哎,相当于是现在是最后一次执行了,因为已经所有数据都读完了,读完之后,那么这里面有一个close,看他close之前干了什么事,别着急,到这儿之后进入。哎,进进来之后啊,这有一个collect刷写,哎往出刷,哎这个close也打个端点哈,这两个个端点,那它怎么往外刷的呢?你说怎么把你环形缓冲去的内容刷到磁盘的呢?那看一下里面内容进。进来进来之后你想啊,他在刷紧之前,我们之前说他要干什么事儿,他要进行快排呀,这要排序啊,那你看往下找能不能找到排序。下走走。再往下,别着急,嗯,别着急往下走。好,走走。
09:02
走到这个位置看啊,这个叫什么叫排序N的一写对吧,哎,排序,那排序是这个位置一写呢,是这。行,那马上要见到真相了哈,往下看,走走到这儿走,哎,然后呢,进来。对吧,哎,进来进来这里面一定是有排序和一写相关操作啊,看一看是不是这样的,我提前打个断点,在这位置个断点啊,啊往下看往下。好,来到这个地方先排序,那排序就进去看一看呗,进来进来之后啊,你看啊,这里面它的参数是一个方法,那我第一次点击进入,它会进入到这里面。我进对吧,哎进get盘那我都得出来。那我第20进是不是进到它了,哎,第20进进来进来之后,那下边这个地方。走走,哎,这就是具体的快牌的逻辑,看快排的逻辑,一直快牌吧,哎,好,那这个我就不详细看了啊,快牌的算法我就给大家讲了出来,哎,出来出来之后再往下走,现在呢,相当于是排完序了,哎,那排完序往下走呗。
10:08
接下来看,排完序之后准备往出溢写,那一写的话,你看我这里面有几个。分区啊。看一下啊,想一下我那个是136137138139啊139,然后还有一个其他是五个分区啊五个分区,那我是要一写五个文件吗。思考一下,我是要一起五个文件吗?不是,哎,它仍然是放到一个文件里哈,只不过呢,放到一个文件里面呢,它是有这个索引位置进行标记出来,你是哪一个分区的,是这样一个分组。好,那往下看,那到这儿的时候呢,我们来看一个文件啊,看一个什么文件呢。看上面这个地方。这地方有个ta high洞大哥啊ma red local啊local rener,然后这下面一直到这到哪呢,一直往下看。
11:05
哎,这里面产生了一个spill out0这一个文件,那看一看有没有对吧?哎,咱们看一看说这里面有一个文件。嗯,来到这里面D盘temp hi,大海哥,然后map red local runner好进来之后。找到最后一个叫造把缓冲缓冲之后啊,你这个日期诶排下去哈,倒序最上面一个,然后点开点开你看这里面还真有一个密写文件,然后你右键打开。目前是什么样的,目前是空的吧,啊目前它是空的。那下面我们来看,再回到这个源码,那空的话呢,现在你看我干嘛,我要循环便利,每一个分区一共五个分区,对吧,分区内都是有序的,那好,那看他干什么事儿,往下走,往下走。这个可以缩小。啊,往下走走。
12:02
看这位置。他开始这个往里面赋值,赋这个key start和value start,那你看是用什么操作的。他所有的排序操作,其实针对的都是这个索引,对吧,而且往出写的时候也是按照索引的位置往出写。啊,这就是之前咱们说的,它排序的时候啊,是按照K的索引进行排,并没有移动你原始的存储数据的位置。那简单往下看,往下走,这是走第一个分区啊,这是第一个分区啊,一直往出写,再写处理。好,往出斜斜。走走好,第一个分区啊,零号分区处理完了对吧,那先往下,你看现在这个分区变成哪个分区了,一号分区了吧,那你看一下这里面有没有数据了。再回来对吧,现在还是零吧,刷新,然后我右键打开。看到吗?里面就有相应的内容了,你看就这么神奇。嗯,就是通过这样先写第一个分区对吧,然后再写第二个分区,第三个分区,一直写到是不是第五个分区就结束了,那这块我就不在这儿一直打到那什么了啊,一直等了,那怎么办呢?你看我现在是零号分区选完了,那现在开始第一号分区啊。
13:11
二分区再来三号分区,四号分区好五号分区是吧,哎,五号分区,那五号分区的话,那这边我就慢一点了哈,我给他走走下去。好,往下往下。往下。走走走,Close出来。哎,解锁出来走往下往下看。继续,哎,走到这位置,这个位置要打个断点叫mege and part啊,那这又是什么位置了,你现在已经产生了一写文件,那我对这个一写文件要干些干些什么事。说末的,哎,末的规定好,那你产生了一起文件,我要进行末的规定,那我进去看一看。进去。进去之后往下走。看。
14:00
看这行代码,这行代码说我遍列所有的一写文件看到了,那我现在有几个一写文件,我这里面是不是现在只有一个一写文件对吧?哎,只有一个一写文件,那一些文件之后象征性的是不是也得变了一下,你看哎象征性的处理一下出来了。那你处理完之后,他发现啊,我把所有的文件一写完之后,是不是只剩一个了。对吧?哎,如果你只有一个的话,那这个SP1写的文件就是最终输出的文件,这不很简单吗?因为你不管你一写多少次,我最终需要把你这个文件合并成一个文件。哎,让别人来读这不就OK了吗?那别人读的时候呢,是按照哎,这是零号分区,一号分区,二号分区,三号分区,四号分区来拉取自己指定分区的数据不就完了吗?这样吗?哎,好,那你都能看到啊,那我们再往下看啊,这块呢是处理啊。输出走,哎,排序结束了啊,这次排序结束结束之后,你看一下我这里有没有变化,看到没。哎,我这个规避完事之后会产生一个index文件,那这个index文件有什么用啊,啊,大家说有什么用。
15:08
你想啊,我这个呢,是实实在在存储的数据内容,对吧,按分区好放好了。那我reduce来拉取数据的时候,我怎么知道我拉的这个数据是从哪开始,从哪结束啊,谁来告诉我,那这个就是那个账本index,哎,我一读一下这文件啊,一看我这是一号分区,那我从这了,好,那如果是三号分区0123,那我从这把数据读走。这就OK。所以说哎,现在呢,我们也已经走到了这个墨迹归并完之后了,对吧,哎,好,那往下看呗。这下。走。啊啊,那搜集器collect结束,那map阶段现在呢,至此就整个马上要结束了啊,那结束之前要注意啊,它map test结束之后是不是要发往radio task,那发往radio task的时候,你要提前在radio task打一个断点啊,在哪个地方呢?嗯。
16:07
Reduce task啊,标上在这个high do map right啊,这个是就一篇没问题啊,啊来到这里面看一下在哪打断点呢,搜索一下它is map or reduce。来到这个位置,然后打上站点,这样呢,它下面我在执行这个map test的时候,他就不会跑了啊,不会跑了啊,心态心留底了,然后呢,接下来我们开始执行啊,继续往下走。走,哎结束了对吧,哎结束结束。结束之后再找,再找。这种。马上要结束了啊,看好好来,你看一下子就跳到了哪啊,Reduce task跳到这个地方啊,一定要提前打断点啊,你不提前打断点抓不到对应的这个位置。
我来说两句