00:00
好,到现在为止啊,我们三个类呢已经写完了,那下面呢,我们对这个程序啊进行一个测试,看看会不会一遍成啊,那运行的时候呢,点击它,哎,在胶窝里面点它,那上面这个呢是正常运行run,那下一个呢是debug哈,那我们先来正常运行一下,选入运行。运行完毕之后,我们来查看一下我们的输出结果I output,那这里面有四个文件,四个文件呢,前两个呢都是C校验,那这个呢,我们就不用看了哈,那第三个呢,是这个下划线,这个success大小是零,什么含义?哎,它只是代表说我这个执行成功了啊,没有什么其他含义,那下面呢,这个才是我们真正想要的数据。那下面真正想要数据叫part,嗯,是一部分,那RR表示什么含义?是是reduce的一个输出结果,会在这中间加一个R,如果你这个运行啊,连reduce都没有,那就没有这个R啊,这个啊注意一下,那后面呢,这是000,它表示的是第一块分区数据,那后面呢,如果你的分区比较多的时候,它会0001啊,然后0000002啊一一直呢往下加。
01:06
直到加到这个99999对吧,哎,加到这些这么多分区啊。那么来看一下这里面的内容,右键打开,用这个notepad加价,打开之后呢,这就是我们最终输出的一个结果,就跟我们期望的输出结果是一模一样的。对吧?哎,这是我们期望的一个输出,但你看这里面这个数据它是不是排序了ABC对吧?嗯,那我但是你会发现我们这代码里有没有我们人为的去干预它,让它去排序,哎,没有,只不过呢是hiop默认会对这个数据进行排序,那后面我们再讲suffer的时候呢,会给大家说,诶这个hiop当中有哪几种排序,什么时候进行相关的一个排序啊。那这个项目呢,就已经运行完毕,那运行完毕之后啊,下面呢,我给大家这个用debug的方式进行调调之前我再来运行一遍,会发生什么结果呢。有同学再运行肯定还能运行啊,那是呗,试验一下。
02:00
你看啊,同样的代码,我再次运行的时候就出错了,说file already exist,说output director,这个已经存在,哎,再次证明说在MAP6程序当中,如果你的输出路径存在,那他们直接就报错,哎,这就报错,那这块怎么办呢?哎,我们可以把它删掉。哎,删掉之后呢,我们再次运行一下。右键执行。哎,你就会发现对吧,哎,又正常了,那行,那这是这个要注意哈,就说你二次执行的时候,你可以怎么办呢?你可以把这个路径修改成二。这不就行了吗?哎,就换成二哈。那下面呢,我们要对这个程序啊进行一个debug,让大家彻底的去了解一下这个word count程序它到底怎么走的。那么需要打断你。哎,打断点呢,大家都会,但是打在哪儿。这绝对就是画龙点睛之笔了啊,那点在哪呢?人家说点在这儿啊,有用吗?没用。
03:00
那点在这儿好像也没用啊,告诉大家点在哪啊啊,我们关心哪就点哪,比如说我们关心的这个driver啊,是这种成熟的套路,正常代码程序往下走啊走走这呢是提交,提交完之后它会走到哪呢?走到这个对应的。麦方法。对吧,那进入到map方法之前,它会有一个这个地方。还记得它有一个run方法吗?Run方法里面有一个setup,还有一个up。对吧,这个在map里面,我们已经刚才已经点了。爱关心map,关心他的启动和这个,呃,结束那个同学说我在这点在这能点上吗?嗯,其实这个打不上啊,打不上,你说我不在这打,我打在这打在这个注释上打行不行,哎,注释也不要打啊,我们要打在这个真正的这行代码上。行,这是map,那接下来我们再打一下这个radio绳啊。Reducer,我们关心,首先这里面进来,我要打。嗯,再往下进到这里面去。
04:04
Set up。Finally,那这是整个程序的运行的一个节点啊,那好,那断点已经打完,打完之后呢,下面我们开始debug调试,那怎么运行呢?点这点这个debug中。大家猜第一个断点会进入到哪里?啊,一下子先进入到这个run方法了,对吧,哎,Run方法进到这个set up,这是相当于是对程序的一个初始化,对吧,来初始化。那执行之前先给大家解释这么几个按钮。啊,据说大家精通的是这个,呃,Debug调试对吧,其实呢,这是作为一个程序员必备的一项技能。现在我们来看看你是否精通,那首先第一个这一行代码儿表示什么含义,表示从当前行向下走一行。那线下走一行,那这个呢,这个呢,如果你是一个方法的话,它会进入到你这个方法里面进行一个执行,如果你进行它呢,就直接把这行跨过去了,那好,那下面这个红的呢,表示强制进行到你这个下一个方法里面,哎,强制进好,那如果你进入到方法里面,我想从这方法里面退出,那就点它直接从这方法里面退出。
05:13
哎,是这个含义啊,那这个有什么含义呢?这也是啊,如果说你看啊,这里面我打了一个断点,那我执行它之后,它会快速的执行到你下一个最近的这个断点,哎,相当于是全数运行当中啊,两个断点之间的一个全数运行啊这样一个走法啊。好,那再回忆一下。这是。执行一行进入方法,强制进行进入方法,那这个呢,是跳出这个方法好。那走到这之后,那下面我们怎么找,是不是从这行往下走啊,哎,下来。下来之后进入到这儿,那我们要继续进入到这啊,那么下周进到这儿,进入到这儿之后呢,我就要进到这个map方法里面进行一个观看,那观看的话,首先它会进入到哪里呢。有的说那直接进到麦克方法不是。
06:00
他是先看你这个参数,哎,先执行你参数里的值,然后才会执行到你的方法,你看啊他怎么走的。啊,比如说我进入。这个吧,啊,强制进入,进入进来之后是不是get到他呀,哎,然后我。出去。然后我再进入,再进入的话就是走的get current value强制进入。然后再出来,再出来之后我再强制进入,看好了走。看到哪里了,是不是到了这个map方法里了,哎,就来到这儿了啊,来到这儿之后呢,我们往下看,那我们执行一行呗,往下走。执行一行之后,你会发现。我当前的。这个K,嗯,这个K我看啊,这是Y6 Y6呢是艾特硅,艾特硅谷对吧,艾特硅谷艾特硅谷啊有了那K的值呢,我看一下这个K啊K目前这也是空。B窗口,你看看这个K的值K,嗯,K的值是不是零,这呢。
07:04
对吧,K的Y流值是零啊,那这个Y流呢,Y流是多少呢。Y流呢,是这一行内容,看有没有转移过来。啊,它是转换成那个。对应的这种转移字符了哈,那看看这呢,艾特股对吧,艾个股,那这个K呢,是它这一行的偏移量,也就是说从这个这开始啊,那接下来往下走,这一行获取到,获取到之后往下走,哎,走到这。那Y流有了,Y流有了之后,我对它这一行呢,用空格进行一个切割。下切割之后你看。直接转换成对应的数组里面的值,数组里面的值,那数组里面的值,我是数组里面有几个值啊,两个值,那两个值我这块会循环遍历几次。是不是两次啊,两次好往下走。下,哎,那第一个word那个at硅谷拿下来找,哎,好,那这里面这个K呢,就已经set成at硅谷了。
08:00
那行,那这个里面就不要记了啊,这个后面我们会在家详细去看啊contest啊,那这里面往下一行找进来,那第二次循环往下找对吧?哎,那第二个S步再往下。那我再执行一行往下走,那是不是这X5就已经执行完了,好执行完了。走,你看跳出来了吧,哎,跳出来了,跳出来之后往下走进到哪呢?走,哎,你发现是不是又回到这个map方法了,哎,相当于是我这第一行爱特圭谷这一行已经执行完了,那接下来他该执行哪一行了呢?嗯,直接强制进入。进入。最初。进入。是不是又来了,哎,又又进入到这个麦方法里面,但是这次进入的就是这个宋数第二行内容。进来之后你会发现它的K已经变成多少了,这这也行,看下面也行啊,K数已经变成17了,那这个17怎么来的,你看一下啊,这里面值。
09:00
呃,从这开始,0123456,空格七八九十,11 12 13 14。十五十六十五十六怎么来的叫回车和换行啊,它后面有两个符号,一个叫回车符,一个是换行符,然后到这儿呢,是17。哎,是这个意思哈,所以说他这个首位呢,是哎17下一行从这17开始往后排啊。这样一个去数就行了,那行,那宋宋来到之后呢,往下走,哎,这一行下来。那之后呢,再对它进行一个切割,那切割出来送送对吧,对应的这个输出。再往下。再往下呢,哎走哎进来进来之后循环几遍,我是两个送送对吧,哎循环两遍。历练。第二遍。好,出来出来之后结束了啊,结束了,结束之后呢,你再下来诶,又进入到麦克方法,那下一行是不是就进入到这个苍老师这一行了啊,那这块呢,其实我就不一个一个的啊,给大家去看了哈,那这时候呢,点这个全数运行啊全数运行。
10:07
哎,现在苍老师啊,现在变成教。再执行。这回呢,变成班长。学。Hi杜op对吧?诶到hi doop我再强制执行,它会到哪儿呢?相当于我这七行内容啊,都已经结束了。我全数走。哎,都执行完毕之后进入到哪里。Clearup finally对吧?哎,执行完毕,执行完毕,我从这再跳出去,它会进到哪里呢?是不是进入到这个reduce的一个run方法了啊,也说map阶段结束,进入到reduce阶段,那reduce阶段首先进来的是这个初始化,那初始化往下走,先往下走一行,对吧,进入到这里面。你看就跳转到对应的这个reduce方法。那reduce方法里面又是怎么走的呢?你看一下打开他的key。
11:01
你再打开它对应的Y6啊,好,那你看一下它的K啊,K呢,就是这个艾特硅谷。那为啥传进来的是爱特硅谷呢?不是别人呢?你看啊,是不是A在这个质点顺序当中,它是排首位啊,哎,所以说把这个艾五先排进来了,那它的Y6是什么样的值呢?Y6。Context你看它Y流哈,它传进来的是一个Y流斯,但是Y流斯啊,给它是一个递值,它并不是一个数字啊,其实呢,它是一个集合,就是它对吧?哎,是一个集合。那好,那集合我们往下走,那第一行上等于零,往下走上等于零没问题,然后呢,我。直接下一行吧,啊,下一行进来,那进来函进来之后,你看这个Y流是不是等于一呀,哎,第一个Y流值就是一,那一的话呢,跟这个萨米相加,诶出来。加完之后S等于一,那这个我进来的是艾特硅谷,艾特硅谷有几个,是不是有两个呀,我再往上走。
12:02
是不是它又加一次啊,又加一次,那下来那是不是艾硅五已经变成二了,哎,这样就把这个艾硅谷这个单词再加完了。好,那往下走。再往下,萨姆等于二,然后写出去,解除。解出你看解除之后是不是又来到这个reduce这个里面去了,哎,我再进入进去。进。哎,又进来了,进来之后呢,往下走。那我当前这个K是谁呢,看。是班长吗?刚才呢是艾特鼓舞,现在是班长,那班长是B打头吗?哎,B打头,所以说他是第二个,那班长再往下走啊,往下一行班长几个呀?班长这里面是不是一个呀?那如果是一个的话,我这块会循环几次呢?下。萨姆等于一再找。是不是就结束了,哎,他只累加一次啊,再往下,然后下面呢是contact往出写出啊,写出的时候啊,后面带大家看源码的时候再大家看啊,那现在呢,就是班长一写出去输出到这种情况。
13:10
那好,那这个reduce会执行几遍?因为我有七个K吧,2467个K,那七个K是不是要执行七遍这个reduce。那每一个K呢,都会执行一遍,那现在下面我继续走走。进入出进入出进入。对吧,哎,这样就进来了,那进来呢,第三个key呢,就是对应的苍老师啊苍老师,然到后面呢,这块我们就全束走了,就不再一点点走了。好,你看最终这几个七行已经结束完毕之后,再次执行它对应的clear up方法,对吧,按clear up方法进行一个收尾工作,那当然了,我们目前呢,这个clear up和setup都是空的啊,根据你的业务需求需要增加我们就增加。
14:00
行,那我们接下来全数运行。嗯,看不到这个控台信息了哈。哎,公差信息已经结束了哈,那我们来看一下这个最终的结果。找一下hioop。我们是OUTPUT2对吧,哎,有结果打开。你看跟我们之前运行的结果呢,是一模一样的啊,这就是整个这个呃,Word count的一个运行程序啊,呃,我建议大家呢,在学习这个沃抗的时候啊,一定要debug进行调试,而且要反复的进行一个调。因为后面我会大家看所有的这个扩张一个源码啊,那那先从这个word count开始,先看其中的一部分啊,这只是其中一部分啊,那这里面包括map它是怎么走的,Reducer是怎么走的,像debug这项技能是我们程序员必备的技能,如果你连debug都不会。那么你遇到这种复杂的问题啊,你还真的不好调。啊,那如果是这个多线程的问题的时候,那我们后面会教大家对应这种多线程不方便debug的时候,我们其实还有其他的这种方法啊,我一般呢叫卫兵啊,就是打这种112233这种啊,记录它相应的一个执行流程,那帮辅助我们后续的一个啊开发这种呢方式呢是非常非常的啊,这种技能一定要会啊,反复强调一定要会,至少你要抵BUG3遍以上。
我来说两句