00:00
好,接下来呢,给大家介绍一下maps核心思想啊,首先来看一下图啊。呃,这里有个需求,说统计其中每一个单词出现的总次数啊,一说统计单词的总次数,What,看时又来了,哎,说查询结果呀,是A到P一个文件,Q到J一个文件。那假如说下面呢,这就是我们要统计的数据源。你可以把它理解为一本书啊,一本英文书对吧,这里面有大部分的这个单词,那如果现在我让你人工的去统计,你怎么统计。我建议你统计这本书当中,哎,A到B。单词啊,首字母是A到P的,放到一个文件里面,各到这再放一个文件。那通常你的做法是这样的吗?首先这是你那一个是A到P,一个文一个文件,那A到PQ到J,比如说我会准备两张纸,一张纸呢是A到P。另一张纸呢,是Q到Z。然后接下来你会怎么办?我会去读一下啊,一行一行读吧,对吧,我读第一行阿姨发现hi doop,那放到哪里,诶放到A到P。
01:08
好,那我再读呢,说Spark,哎,Spark have啊,遇到Spark have你怎么办,这是一行啊,那我说中间用这个空格给它切开,切开之后哦,一看S放到这个里面,然后have呢,放到上一面里面去,但你发现我要统计一本书,你一个人去这么统计。那是不是感觉慢呢,那这是什么?哎,那这时候比如说我把这个。哎,来一个。我再叫一个人,我把宋老师叫过来,对吧?我把宋老师叫过来,那宋老师呢,他也会像我一样准备两张纸。一个呢是A到P,另一个呢是Q到G。哎,看到这里。是这样吗?哎,看到谁。那你这两个人发现好像还是很慢。是吧?哎,那宋老师就想个招啊,说这个男女干活,这个男女干,男女搭配干活不累是吧?哎,他又把苍老师叫过来了。
02:04
也让常老师再准备A到PQ到Z1张纸。这样去计算。啊,而且呢,分工比较明确,比如说啊这个第一个200兆,哎200兆这个内容呢,哎,我俩怎么分呢,我处理其中的128兆。这128兆给我,我来处理。那下面剩下72兆给谁呢?给宋老师。哎,孙老师呢,让这个苍老师把这100兆的数据进行一个处理,那大家呢,这个任务量啊,整体上来说都不是特别大。那欣然接受了是吧?来正常去统计,那统计完之后,因为我要的是整本书当中所有单词统计的次数,也就说A到B放一个文件,可以到这放一个文件里面。那这是什么?我们仨人这么统计完之后,那正常情况下,我们还需要把这三个结果累加在一起吧,好,那这时候呢,我们又把波波老师叫过来了。
03:00
哎,波波老师,波波老师呢,负责帮我们统计,他怎么统计啊?哎,他只负责统计A到P的,把我的A到P拿过去,把宋老师的A到P,把苍老师的A到P拿过去。把这个一累加就OK了。对吧,那这个时候。那好,还有Q到J呢,哎,Q到J呢,我们再把严格再叫过来,那严格呢,把Q到JQ到JQ到J计算完,那最后呢,就会统计,比如说还多。多少呢?哎,出现14,假如说啊,然后呢,这个还有一个Java。对吧,出现100次。这样就实现了一个单词统计的一个效果。啊,人手越多对吧,相对来说速度就快一些啊,其实这思想我们就讲完了。那下面我们来看一下细节,那说代码是如何来实现这个过程的呢?OK,首先map运算呢,一般分为两个阶段,一个叫map阶段,一个叫reduce阶段,那刚才已经看到了,哎,我盛老师苍老师是属于每个人分别干活对吧?哎,处理其中一部分,然后把它分好区。
04:07
一块一块一块一块一块,分完之后,由杨哥和波波老师进行一个统计,那统计的阶段就是reduce,分的过程就是map阶段。往下找。那首先呢,哎,我这边呢,处理128兆,那这个呢,处理72兆,下一个呢处理的是100兆,那为什么这样分呢?哎,你看这个128兆这个这个数字。有敏感度吗?对吧,我们再分讲HGFS的时候,是不是块大小就是128兆啊。啊,一块是128兆,那么我一个每一个map test默认处理128兆数据,那后面再给大家说,为什么是128啊,他能不能改呢?哎,可以,那什么情况下改大,什么情况改小啊后面我们会详细给大家说,行,那这是map t对吧?哎,我干我的活,宋老师他读他那自己的72兆,那这个常老师呢,读他的,哎自己呢,100兆。
05:06
这样就相当于把这本书啊分成了三份,对不对,哎,三份互不相干。那这边说了map阶段呢,是并发运行,互不相干,就说我只处理这本书的前100页啊,就是前128兆,那中间这72道由宋老师来处理,那最后的尾页的100页,哎,由苍老师来处理。OK,再往下走,那他我我是怎么处理的呢?首先我是按行去读数据,一行一行的来读,对吧?哎,避免这个丢丢行好,那下面读到一行,你像这个第二行里面Spark和have,那它是两个单词。我需要把这个单词进行一个切分。I切分出来。再来,那我未来肯定要计数啊。我说这个单词出现多少次?
06:00
那么我在这个map阶段,我只负责取出一个单词,我就在后面标一。来取出一个单词标一,那即使是比如说我这出现一个Spark,再出现一个Spark,那我怎么记我仍然是SPARK1,然后SPARK1这种形式的格式的数据发给谁呀?哎,发给波波老师。让它进行后续累加,它呢,一看哦,这个Spark这个K是相同的,它会把这个末尾这个一一加在一起,那它最终出现的就是SPARK2。哎,这样一个结果。那再来。那我需要统计这个A到P和Q到Z,我是不是得准备两张纸啊,哎,两张纸,一张纸呢,是用来存储A到P,另一张纸存储Q到Z。那对应的代码里面就是分区一和分区二两个分区,哎,分别存储不同的那这个首字母开头的单词。那当然了,这个宋老师和这个苍老师他们也是同样的方式准备两张纸,纸里面存储的对应的这个单词。
07:06
啊,我们的活儿干完之后,那接下来波波老师和杨哥闪亮登场。啊,一个呢,负责A到B的,一个是负责听到这个。好,那reduce阶段呢,是并发reduce task啊,完全互不相干,也就说啊,这个波波老师和杨哥他们两个在统计单词的时候,也是相互没有进行交通交流,不需要啊,因为我只从这拿数据就行了,对吧,我拿我的,我拿我的,我拿的只是A到P跟你之间没有任何交集。嗯,好。这样,哎,波老师把这个他的拿过去了。那杨哥呢,把他自己的推到这的拿走,拿走之后他们最终会给我们出一个报告,哪一个单词出现了多少次,以文件的形式输出出来。好,一人出一个报告就OK了。那map编程呢?只包含其中一个map阶段和一个reduce阶段,比如说它只有一个map阶段和reduce阶段。
08:05
那如果用户呢,想实现这种比较复杂的逻辑,比如说这个任务介绍完之后。计算下一个任务,再下一个任务啊,比较逻辑,这个比较复杂的,那怎么办呢?记住那你只能有多个卖手流程序,第一个一个一个一个一个这样去做,而且呢,之前咱还分析过说map不是不能这么做,但是呢,他不擅长这么做,因为它的效率很低,每次的中间计算结果它都要持久化到磁盘。磁盘的读写效率啊都比较低,那我们后面有这个Spark,它这个中间结果呢,是可以在内存当中进行处理的,那这个效率就会高很多啊好。那行,那这个是外边的核心思想,那看起来很简单,但是呢,其实这里面还有很多细节啊,我们需要后续进行一个讨论,比如说第一个map task是如何工作的,比如说这里面它到底是如何用代码来实现的。我们后续需要解决,还有呢,Reduce task又是如何工作的?它怎么合的?
09:06
Map t如何控制这个分区,比如说我具体怎么来的这两个分区,那其实在底层呢,还有排序。那它怎么排的?再来map task和reduce task之间,他们又是怎么工作的?比如说他们两个怎么工作,比如说map task什么时候结束,结束之后radio task为什么知道?对吧,哎,那这个呢,就是map的一个核心思想啊,你就可以把它分为这是一本书,对吧,让你去统计,你怎么统计。那你自己统计太慢,那你就叫各种帮手啊,来帮你去完成啊。
我来说两句