00:00
好,接下来我们来看一下word count这个案例啊,终于进入到了一个代码阶段了哈,那首先呢,我们来看一下这个需求哈,呃,在给这的文本文件中统计输出每一个单词出现的总次数,那就是标准的word,相当于啊,我们在学Java里面那个hello word对吧?那这里面有一个输入文本,这个文本啊,你可以双击能打开,同时呢,你也可以把它复制走,比如说CTRLC。呃,我一般呢,会把它放到这个电脑的D盘下面有一个input,诶,我会把这个,呃,整个这个MAB6程序当中需要的这个输入内容都给大家写好了哈,啊,我这里面比如说第一个input word啊。Hello,对吧,那这里面的内容呢,有这么几个,比如说艾特硅谷,爱特硅谷啊,宋送宋送苍老师,苍老师教啊班长学hadop,哎,我们就统计这里面每一个单词出现的次数。我把它盯一下。这是输入数据。OK。输入搞定之后,那往下看,那我们期望的输出结果是什么样呢。
01:01
对吧?这是输入,我们期望的输出,长这样统计出来,爱德硅谷出现两次,嗯,这是班长出现一次,苍老师出现两次。Hi,出现一次对吧,哎,学等等。那这里面发现啊,发现一个什么问题呢?艾特硅谷对吧,艾特谷没问题,第一行出现两次,那下一个这个班长,哎,班长原来是在苍老师下面对吧,这是在老师下面,但现在我统计完之后的结果,反而这个班长在苍老师上面。哎,那这里面是不是涉及到一个数据的排序的问题啊。哎,这里面排序是一个非常重要的一个事情哈,好,那下面往下详细看啊,接下来我们说一下这里面map干什么,Reducer干什么,以及driver来干什么事。首先来看输入数据。这时我们的输入数据,我们期望的输出长这样。是吧,哎,长这样,那我们下面这三个类怎么来做呢?首先来到这个map里面。
02:03
将map task传给我们的文本内容先转换成G,为什么要先转换成G呢?给大家看一下。这个代码。这是官网的那个map对吧,Map里面输入的object和test。那你传进来的这个V是不是这一行内容啊。哎,第一个呢是它的偏移量,那后面这个呢,是它的内容。啊,你传入的内容的类型呢,是test,那test下面啊,它对字符串的一个转换,它的这个API非常少,那谁多呢?咱们Java当中这个使string,它的API操作是不是特别多呀?哎,那我们就可以用它,好,那往下找,那把它首先转换成使际,把test转换成实际,诶变成它,那变成它之后我要想统计单词怎么办?我这单词与单词之间用的是空格,那当然也可以用别的啊,啊有的这个公式里面用的什么这个呃,斜杠T对吧?啊贴包键,还有一种特殊制符了,都行,不管你用什么,你用什么我就用什么来切就可以了,那这里面我们用空格。
03:08
之后切割完之后,那就会出现一个一个的单词。那一个一个单词,那不利于我们后续的一个统计,怎么不利于我们统计啊,我们需要比如说你要是更人的话,说艾五五啊,出现一次,你这边记一个,这个AT5又出现一次记一次,那行,但是机器的话,它可没那么智能,它需要你给它进行一个标记,比如说这个AT5单词一,然后这个at单词又来一个一,那最终的结果呢,就是爱的硅谷一,爱的硅谷一这种形式。然后发到radio端进行一个聚合,那有同学说,那你为什么不在这个map端把这俩加在一起呢?哎,那后面我给大家讲啊,什么情况下我们是可以把它加在一起,什么情况下呢是不可以的。哎,好,往后找。哎,At过1AT过一,那下面来到发送到reduce阶段啊,那reduce阶段呢,它就会把相同的key的VALUE6进行后续的处理,那你是加是减,是乘还是除,那跟你的业务逻辑有关系,那我们这个单词统计,那肯定是将这俩加在一起。
04:14
哎,将相同K的Y流值加在一起,那我们最终的输出就是艾特硅谷二。就OK了啊好,那下面我们来看一下这个最终,哎,这个driver阶段我们要做哪些事。一共呢,有八件事啊,其实有的八件,有的七件,呃,看你怎么去数了哈,那比如说第一件事获取配置信息,获取job的对象,那我们要对这个job操作,那肯定得有这个job对象,然后呢,指定本程序的架包所在的本地路径。那你想想,未来要运行这个MR程序,你肯定得有自己的假包,那价包你得告诉这个代码它在哪对吧,那这里面其实我们是后续啊,可以通过反射的方式,哎,定位出来这个夹包,但是呢,我们得设置。那还有这里面要关联对应的map和reduce。
05:01
为啥要做这步呢?那想我们就是写了一个map类,一个reducer类,还写了一个driver。那他们三者之间怎么能够相互找到啊?对吧,我怎么知道我这个driver用的是你的map,用的你这个声呢。那我们需要将这三者之间进行一个配置,那配置的话呢,就是关联map关联。好,那再来。那下面呢,我们需要指定map输出的数据类型,比如说你这个map计算结束之后,你输出的是什么。你得给我定义好以什么形式存在,比如说第一个K,那是单词,比如说test实际类型吗?那这个一呢,那这是这种可以累加的,可以是in的,也可以是嗯,大宝对吧,都可以,那这伙说指定。呃,最终输出的数据的KV,那最终输出的输出的数据的KV,那就是你radio计算完之后。哎,它的一个输出,那可不是说reduce是完事啊,Reduce完事之后还有一个output,后面我会讲,比如说它整个map程序计算完之后的一个输出是什么类型,再来指定job的输入源文件所在的目录。
06:15
那你这个输入数据在哪,是不是得告诉我,因为咱们说过写MAP6程序的时候,它的输入路径和输出路径是必须要给的,那下一个就是job的输出结果所在路径,好,那输出结果路径有一个注意事项,它不能提前存在,如果提前存在会报什么异常了?哎,这个文件就要file already exists。那后面呢,会大家看源码啊,那最后一步呢,就是提交作业啊,有的时候我会把这个六七步放在一起,比如说输入和输出放在一起进行一个设置,那这就是呢,整个这个word count的一个,呃,大概整体上的一个思路,那后续呢,我们就来开始。我们的代码。
我来说两句