`
langyu
  • 浏览: 887887 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MapReduce:详解Shuffle过程

阅读更多



/**
* author : 冶秀刚
* mail     : dennyy99@gmail.com
*/


        Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。要想理解MapReduce, Shuffle是必须要了解的。我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混。前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟。考虑到之前我在看相关资料而看不懂时很恼火,所以在这里我尽最大的可能试着把Shuffle说清楚,让每一位想了解它原理的朋友都能有所收获。如果你对这篇文章有任何疑问或建议请留言到后面,谢谢!

        Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序。如果你不知道MapReduce里Shuffle是什么,那么请看这张图:




        这张是官方对Shuffle过程的描述。但我可以肯定的是,单从这张图你基本不可能明白Shuffle的过程,因为它与事实相差挺多,细节也是错乱的。后面我会具体描述Shuffle的事实情况,所以这里你只要清楚Shuffle的大致范围就成-怎样把map task的输出结果有效地传送到reduce端。也可以这样理解, Shuffle描述着数据从map task输出到reduce task输入的这段过程。

        在Hadoop这样的集群环境中,大部分map task与reduce task的执行是在不同的节点上。当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map task结果。如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种网络消耗是正常的,我们不能限制,能做的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘IO对job完成时间的影响也是可观的。从最基本的要求来说,我们对Shuffle过程的期望可以有:
  • 完整地从map task端拉取数据到reduce 端。
  • 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
  • 减少磁盘IO对task执行的影响。

        OK,看到这里时,大家可以先停下来想想,如果是自己来设计这段Shuffle过程,那么你的设计目标是什么。我想能优化的地方主要在于减少拉取数据的量及尽量使用内存而不是磁盘。

        我的分析是基于Hadoop0.21.0的源码,如果与你所认识的Shuffle过程有差别,不吝指出。我会以WordCount为例,并假设它有8个map task和3个reduce task。从上图看出,Shuffle过程横跨map与reduce两端,所以下面我也会分两部分来展开。

        先看看map端的情况,如下图:




      

        上图可能是某个map task的运行情况。拿它与官方图的左半边比较,会发现很多不一致。官方图没有清楚地说明partition, sort与combiner到底作用在哪个阶段。我画了这张图,希望让大家清晰地了解从map数据输入到map端所有数据准备好的全过程。

        整个流程我分了四步。简单些可以这样说,每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据。

        当然这里的每一步都可能包含着多个步骤与细节,下面我对细节来一一说明:
1.        在map task执行时,它的输入数据来源于HDFS的block,当然在MapReduce概念中,map task只读取split。Split与block的对应关系可能是多对一,默认是一对一。在WordCount例子里,假设map的输入数据都是像“aaa”这样的字符串。

2.        在经过mapper的运行后,我们得知mapper的输出是这样一个key/value对: key是“aaa”, value是数值1。因为当前map端只做加1的操作,在reduce task里才去合并结果集。前面我们知道这个job有3个reduce task,到底当前的“aaa”应该交由哪个reduce去做呢,是需要现在决定的。

        MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。

        在我们的例子中,“aaa”经过Partitioner后返回0,也就是这对值应当交由第一个reducer来处理。接下来,需要将数据写入内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。我们的key/value对以及Partition的结果都会被写入缓冲区。当然写入之前,key与value值都会被序列化成字节数组。

        整个内存缓冲区就是一个字节数组,它的字节索引及key/value存储结构我没有研究过。如果有朋友对它有研究,那么请大致描述下它的细节吧。

3.        这个内存缓冲区是有大小限制的,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写,字面意思很直观。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。

        当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。

        在这里我们可以想想,因为map task的输出是需要发送到不同的reduce端去,而内存缓冲区没有对将发送到相同reduce端的数据做合并,那么这种合并应该是体现是磁盘文件中的。从官方图上也可以看到写到磁盘中的溢写文件是对不同的reduce端的数值做过合并。所以溢写过程一个很重要的细节在于,如果有很多个key/value对需要发送到某个reduce端去,那么需要将这些key/value值拼接到一块,减少与partition相关的索引记录。

        在针对每个reduce端而合并数据时,有些数据可能像这样:“aaa”/1, “aaa”/1。对于WordCount例子,就是简单地统计单词出现的次数,如果在同一个map task的结果中有很多个像“aaa”一样出现多次的key,我们就应该把它们的值合并到一块,这个过程叫reduce也叫combine。但MapReduce的术语中,reduce只指reduce端执行从多个map task取数据做计算的过程。除reduce外,非正式地合并数据只能算做combine了。其实大家知道的,MapReduce中将Combiner等同于Reducer。

        如果client设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。那哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。

4.        每次溢写会在磁盘上生成一个溢写文件,如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个溢写文件存在。当map task真正完成时,内存缓冲区中的数据也全部溢写到磁盘中形成一个溢写文件。最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,当map执行完成时,只会产生一个溢写文件),因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge。Merge是怎样的?如前面的例子,“aaa”从某个map task读取过来时值是5,从另外一个map 读取时值是8,因为它们有相同的key,所以得merge成group。什么是group。对于“aaa”就是像这样的:{“aaa”, [5, 8, 2, …]},数组中的值就是从不同溢写文件中读取出来的,然后再把这些值加起来。请注意,因为merge是将多个溢写文件合并到一个文件,所以可能也有相同的key存在,在这个过程中如果client设置过Combiner,也会使用Combiner来合并相同的key。

        至此,map端的所有工作都已结束,最终生成的这个文件也存放在TaskTracker够得着的某个本地目录内。每个reduce task不断地通过RPC从JobTracker那里获取map task是否完成的信息,如果reduce task得到通知,获知某台TaskTracker上的map task执行完成,Shuffle的后半段过程开始启动。

        简单地说,reduce task在执行之前的工作就是不断地拉取当前job里每个map task的最终结果,然后对从不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce task的输入文件。见下图:




        如map 端的细节图,Shuffle在reduce端的过程也能用图上标明的三点来概括。当前reduce copy数据的前提是它要从JobTracker获得有哪些map task已执行结束,这段过程不表,有兴趣的朋友可以关注下。Reducer真正运行之前,所有的时间都是在拉取数据,做merge,且不断重复地在做。如前面的方式一样,下面我也分段地描述reduce 端的Shuffle细节:
1.        Copy过程,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件。因为map task早已结束,这些文件就归TaskTracker管理在本地磁盘中。

2.        Merge阶段。这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活,它基于JVM的heap size设置,因为Shuffle阶段Reducer不运行,所以应该把绝大部分的内存都给Shuffle用。这里需要强调的是,merge有三种形式:1)内存到内存  2)内存到磁盘  3)磁盘到磁盘。默认情况下第一种形式不启用,让人比较困惑,是吧。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的那个文件。

3.        Reducer的输入文件。不断地merge后,最后会生成一个“最终文件”。为什么加引号?因为这个文件可能存在于磁盘上,也可能存在于内存中。对我们来说,当然希望它存放于内存中,直接作为Reducer的输入,但默认情况下,这个文件是存放于磁盘中的。至于怎样才能让这个文件出现在内存中,之后的性能优化篇我再说。当Reducer的输入文件已定,整个Shuffle才最终结束。然后就是Reducer执行,把结果放到HDFS上。

        上面就是整个Shuffle的过程。细节很多,我很多都略过了,只试着把要点说明白。当然,我可能也有理解或表述上的很多问题,不吝指点。我希望不断地完善和修改这篇文章,能让它通俗、易懂,看完就能知道Shuffle的方方面面。至于具体的实现原理,各位有兴趣就自己去探索,如果不方便的话,留言给我,我再来研究并反馈。
  • 大小: 62.2 KB
  • 大小: 25.5 KB
  • 大小: 209.5 KB
45
0
分享到:
评论
41 楼 langyu 2012-08-12  
ddvk2007 写道
樓主 我想請問關於google 的mapreduce
為什麼他shuffle 為什麼會重複運行(我在程式碼中並沒有看到用來重複呼叫迴圈的語法)?
謝謝

Google MapReduce的Shuffle会重复运行吗?抱歉,论文中我没有看到这样的描述。是的,那个Shuffle在每个Job中是一次性的,样例代码中也没有重复执行的语法。
如果你再有疑问的话,麻烦附带参考资料,我们一同分析。
40 楼 ddvk2007 2012-08-12  
樓主 我想請問關於google 的mapreduce
為什麼他shuffle 為什麼會重複運行(我在程式碼中並沒有看到用來重複呼叫迴圈的語法)?
謝謝

39 楼 langyu 2012-08-10  
ddvk2007 写道
我想請問google的mapreduce
他的程序是 map→shuffle→reduce
那要麼樣才可以讓reduce回到shuffle進行疊代呢?

重新启动一个Job
38 楼 ddvk2007 2012-08-10  
我想請問google的mapreduce
他的程序是 map→shuffle→reduce
那要麼樣才可以讓reduce回到shuffle進行疊代呢?
37 楼 langyu 2012-05-21  
ansjsun 写道

如果最终的多个reducer没有合并.那么.
在对于排序这种需求..只能在Combiner 中不是通过hash来分配reducer..通过大小来区分..可以
或者再用reducer的结果..再跑一次..job  ...来合并为一个....

对,这种需求,自己扩展。要么再来一次Job,要么在Partition上下功夫
36 楼 ansjsun 2012-05-21  
langyu 写道
ansjsun 写道

reduce是多个的情况下...加入以排序为例...
那么单独一个reduce..处理完毕后..的操作写到硬盘或这驻留内存中
但是最终结果的处理应该是在一个reduce上吧...
那么多个reduce也是一个归并的过程???这个细节是怎么处理的

这个问题你可以试下,如果有多个Reducer的话,会出现什么情况。
首先,Reducer的输出数据是直接写入HDFS的。其实,如果有多个Reducer的话,那么在HDFS的output path下就会有多个像这样的“part-xxx”文件。文件是以Reducer number为标识,每个文件对应着一个Reducer。所以没有最终多个Reducer的归并过程。



如果最终的多个reducer没有合并.那么.
在对于排序这种需求..只能在Combiner 中不是通过hash来分配reducer..通过大小来区分..可以

或者再用reducer的结果..再跑一次..job  ...来合并为一个....

35 楼 langyu 2012-05-21  
ansjsun 写道

reduce是多个的情况下...加入以排序为例...
那么单独一个reduce..处理完毕后..的操作写到硬盘或这驻留内存中
但是最终结果的处理应该是在一个reduce上吧...
那么多个reduce也是一个归并的过程???这个细节是怎么处理的

这个问题你可以试下,如果有多个Reducer的话,会出现什么情况。
首先,Reducer的输出数据是直接写入HDFS的。其实,如果有多个Reducer的话,那么在HDFS的output path下就会有多个像这样的“part-xxx”文件。文件是以Reducer number为标识,每个文件对应着一个Reducer。所以没有最终多个Reducer的归并过程。
34 楼 ansjsun 2012-05-21  
感谢楼主的无私奉献.写的很好..我现在有一个疑惑是..
reduce是多个的情况下...加入以排序为例...

那么单独一个reduce..处理完毕后..的操作写到硬盘或这驻留内存中


但是最终结果的处理应该是在一个reduce上吧...


那么多个reduce也是一个归并的过程???这个细节是怎么处理的
33 楼 329937021 2012-05-10  
langyu 写道
329937021 写道
这里问个问题,reduce进程是在什么时候启动的呢?还有就是每个reducer到map那边取属于自己的那块数据的时候,是取map结果所有数据呢?还是取map结果中属于这个reducer的数据?能否分析下代码?感谢!

reduce task是当正在运行+完成的task到达一定比例就由JobTracker分配运行。Reducer到map端取数据时当然只取partition到它自己的那一部分数据。如果有两个reduce task,那么第一个reducer task的index就是0,到map端取数据时也是取map端所有对key partition后,属于reduce 0的那些数据

楼主,但是我在源码中没有看到这块代码,MapOutputCopier类中的copyOutput()那一块是写清楚了reducer是取属于自己的那块数据的呢?能否加个qq聊一下,私信给你吧。
32 楼 langyu 2012-04-24  
lookqlp 写道

你看看那篇文章,里边有个结论,一个split不可能有零点几个block,也就是说一个split对应多个block。你看看他分析的对不对

好吧,我在文章中声明我分析是基于Hadoop 0.21版本,他说他基于0.18.3。在0.20版本以后,client不能设置你想要几个map task,由jobclient来自动分配,一个split可能就是零点几个HDFS block。
31 楼 lookqlp 2012-04-24  
langyu 写道
lookqlp 写道

http://www.cnblogs.com/xuxm2007/archive/2011/09/01/2162011.html
看看这个,他说的是0.1版本,我现在迷糊了。我觉得合理的话应该是分片和分块是多对一的关系

你理解的没错。正常也应该是多个split对应着一个block。这取决于block的size与权衡一个map应该执行多少M的数据。默认一个block是64MB,让一个map task来执行是很合理的。如果block是512MB,那么就划分多个split来执行这个block,每个map task执行的时间也就比较合适

langyu 写道
lookqlp 写道

http://www.cnblogs.com/xuxm2007/archive/2011/09/01/2162011.html
看看这个,他说的是0.1版本,我现在迷糊了。我觉得合理的话应该是分片和分块是多对一的关系

你理解的没错。正常也应该是多个split对应着一个block。这取决于block的size与权衡一个map应该执行多少M的数据。默认一个block是64MB,让一个map task来执行是很合理的。如果block是512MB,那么就划分多个split来执行这个block,每个map task执行的时间也就比较合适

你看看那篇文章,里边有个结论,一个split不可能有零点几个block,也就是说一个split对应多个block。你看看他分析的对不对
30 楼 langyu 2012-04-24  
lookqlp 写道

http://www.cnblogs.com/xuxm2007/archive/2011/09/01/2162011.html
看看这个,他说的是0.1版本,我现在迷糊了。我觉得合理的话应该是分片和分块是多对一的关系

你理解的没错。正常也应该是多个split对应着一个block。这取决于block的size与权衡一个map应该执行多少M的数据。默认一个block是64MB,让一个map task来执行是很合理的。如果block是512MB,那么就划分多个split来执行这个block,每个map task执行的时间也就比较合适
29 楼 langyu 2012-04-24  
大海lb 写道
但是还有个疑问是,reduce task自己确实是知道自己是第几个,但是当他找jobtracker的时候,是否说jobtracker会告诉他那些key/value的partitioin是他的,他就能抓到对应的?

Map task在运行后生成一对对的key/value,然后分别对每个key做partition,决定这对key/value应该让哪个Reduce task来执行。Map运行完成后,就会按Reduce数将不同的partition的数据整理到一块,等待ReduceTask来抓取。这个过程跟JobTracker没关系。更详细的信息请参看上面介绍Shuffle前端介绍MapTask运行的部分
28 楼 lookqlp 2012-04-24  
langyu 写道
lookqlp 写道
引用
Split与block的对应关系可能是多对一,默认是一对一

在我印象中split和block是一对多的关系。一个split不可能有零点几个block。

确定没有记错?


http://www.cnblogs.com/xuxm2007/archive/2011/09/01/2162011.html
看看这个,他说的是0.1版本,我现在迷糊了。我觉得合理的话应该是分片和分块是多对一的关系
27 楼 大海lb 2012-04-23  
langyu 写道
大海lb 写道
你好,我想问下,就是map输出存到本地后,reduce任务运行,reducer的线程定期会去询问jobtracer,是不是这个地方他询问的时候去问jobtracer之前通过key取hash,再对reduce取模的结果中找到属于自己的文件然后copy下来,还是其他的原理?谢谢

你是不是想知道 reduceTask 怎样确定它抓取map端的哪部分数据? 如果是这个问题的话,那么解答是:在JobTracker上创建ReduceTask的时候,每个ReduceTask自己就知道自己是第几个Reduce,也就是partition。去Map端抓取数据时就根据这个partition去取。不用其它的计算!如果不是这问题,那么你的这句话怎样理解:是不是这个地方他询问的时候去问jobtracer之前通过key取hash ?


楼主回复的真快,在下的意思有点模糊,楼主还是回答了我想问的问题(谢谢),但是还有个疑问是,reduce task自己确实是知道自己是第几个,但是当他找jobtracker的时候,是否说jobtracker会告诉他那些key/value的partitioin是他的,他就能抓到对应的?
26 楼 langyu 2012-04-23  
大海lb 写道
你好,我想问下,就是map输出存到本地后,reduce任务运行,reducer的线程定期会去询问jobtracer,是不是这个地方他询问的时候去问jobtracer之前通过key取hash,再对reduce取模的结果中找到属于自己的文件然后copy下来,还是其他的原理?谢谢

你是不是想知道 reduceTask 怎样确定它抓取map端的哪部分数据? 如果是这个问题的话,那么解答是:在JobTracker上创建ReduceTask的时候,每个ReduceTask自己就知道自己是第几个Reduce,也就是partition。去Map端抓取数据时就根据这个partition去取。不用其它的计算!如果不是这问题,那么你的这句话怎样理解:是不是这个地方他询问的时候去问jobtracer之前通过key取hash ?
25 楼 大海lb 2012-04-23  
你好,我想问下,就是map输出存到本地后,reduce任务运行,reducer的线程定期会去询问jobtracer,是不是这个地方他询问的时候去问jobtracer之前通过key取hash,再对reduce取模的结果中找到属于自己的文件然后copy下来,还是其他的原理?谢谢
24 楼 langyu 2012-04-22  
329937021 写道
这里问个问题,reduce进程是在什么时候启动的呢?还有就是每个reducer到map那边取属于自己的那块数据的时候,是取map结果所有数据呢?还是取map结果中属于这个reducer的数据?能否分析下代码?感谢!

reduce task是当正在运行+完成的task到达一定比例就由JobTracker分配运行。Reducer到map端取数据时当然只取partition到它自己的那一部分数据。如果有两个reduce task,那么第一个reducer task的index就是0,到map端取数据时也是取map端所有对key partition后,属于reduce 0的那些数据
23 楼 329937021 2012-04-22  
这里问个问题,reduce进程是在什么时候启动的呢?还有就是每个reducer到map那边取属于自己的那块数据的时候,是取map结果所有数据呢?还是取map结果中属于这个reducer的数据?能否分析下代码?感谢!
22 楼 langyu 2012-04-13  
lookqlp 写道
引用
Split与block的对应关系可能是多对一,默认是一对一

在我印象中split和block是一对多的关系。一个split不可能有零点几个block。

确定没有记错?

相关推荐

    MapReduce详解Shuffle过程

    MapReduce详解Shuffle过程 MapReduce的Shuffle过程是MapReduce的核心部分,也被称为奇迹发生的地方。要想理解MapReduce,Shuffle是必须要了解的。Shuffle过程描述着数据从map task输出到reduce task输入的这段过程...

    详解shuffle过程

    Hadoop Shuffle 过程详解 Hadoop 的 Shuffle 过程是 MapReduce 的核心,也被称为奇迹发生的地方。要想理解 MapReduce,Shuffle 是必须要了解的。Shuffle 的正常意思是洗牌或弄乱,可能大家更熟悉的是 Java API里的 ...

    006_hadoop中MapReduce详解_3

    "006_hadoop中MapReduce详解_3"可能是指一个系列教程的第三部分,着重讲解MapReduce的核心概念、工作原理以及实际应用。在这个部分,我们可能会探讨更深入的技术细节和优化策略。 MapReduce的工作流程分为两个主要...

    MapReduce平台优化详解.pdf

    MapReduce平台优化详解 MapReduce平台优化是Hadoop生态系统中的一种关键技术,旨在提高MapReduce作业的执行效率和性能。本文将从MapReduce优化的角度,深入剖析MapReduce平台的优化方法,涵盖Combiner、Partitioner...

    MapReduce详解包括配置文件

    ### MapReduce详解包括配置文件 #### 一、MapReduce概览与原理 MapReduce作为Hadoop的核心组件之一,提供了一种高效、可靠的分布式计算框架。它最初由Doug Cutting基于Google发表的论文《MapReduce: Simplified ...

    MapReduce计算模式详解

    ### MapReduce计算模式详解 #### 一、MapReduce简单概述 MapReduce是一种高效的大数据处理技术,它由Google提出并在Hadoop中得到了广泛的应用。MapReduce不仅是一个计算平台,还是一个并行计算框架和并行程序设计...

    mapreduce:该存储库包含一些面试任务

    - **MapReduce的 Shuffle过程详解** - **如何处理倾斜的数据分布问题(Skewed Data)** **6. 实战示例** 在面试中,可能会要求你编写简单的MapReduce程序,例如统计文本文件中单词出现的次数。这通常涉及到自定义的...

    005_hadoop中MapReduce详解_2

    MapReduce的工作流程分为三个主要阶段:Map、Shuffle和Reduce。首先,`Map`阶段接收输入数据,将其切分成键值对,然后通过用户自定义的Mapper函数进行处理。Mapper函数通常用于数据清洗、转换和计算。在这个阶段,...

    基于MapReduce的矩阵相乘算法代码及其使用

    ### 基于MapReduce的矩阵相乘算法详解 #### 一、背景介绍 在大数据处理领域,MapReduce 是一种非常流行的编程模型,用于并行处理海量数据集。该模型由 Google 首次提出,并被广泛应用于搜索引擎、推荐系统等场景。...

    Mapreduce原理

    ### MapReduce原理详解 #### 一、MapReduce与Hadoop概述 MapReduce是Apache Hadoop项目的核心组件之一,主要用于处理大规模数据集的分布式计算。它不仅是一种编程模型,还是一套支持这种模型的软件框架。MapReduce...

    mapreduce-examples:mapreduce-examples

    《MapReduce 示例详解》 MapReduce 是一种分布式计算模型,由 Google 在2004年提出,主要用于处理和生成大规模数据集。它将复杂的并行计算任务分解为两个主要阶段:Map(映射)和 Reduce(规约),使得在大型集群上...

    Hadoop MapReduce.pdf

    #### 二、MapReduce工作流程详解 1. **输入切分**:Hadoop将输入文件分割成固定大小的块,每个块作为Map任务的输入。 2. **Map阶段**: - 输入的每一条记录被传递给Map函数。 - Map函数对输入键值对进行处理,...

    mapreduce.pdf

    MapReduce的核心思想是将复杂的、大数据量的计算过程分解成两个基本阶段:Map(映射)和Reduce(规约),这两个阶段通过简单的函数来实现。 - **Map阶段**:首先,数据被分割成小块,每一块由一个Map任务处理。每个...

    MapReduce架构

    ### MapReduce架构详解 #### 一、概述 MapReduce是一种重要的编程模型,它不仅能够处理大规模数据集,还能实现高效的大数据处理与分析。MapReduce的设计初衷是为了简化并行编程,使得开发人员无需深入理解底层...

    Spark-shuffle机制.pdf

    ### Spark Shuffle机制详解 #### 一、Spark Shuffle概念与作用 **Spark Shuffle**是指在Spark应用程序执行过程中,数据从一个节点或分区移动到另一个节点或分区的过程。这种数据重分布通常发生在诸如`groupByKey`,...

    MapReduce核心思想图文详解

    - **排序(Sorting)**:MapReduce框架会在Shuffle阶段自动完成键的排序,确保同一键的所有值被集中在一起。 3. **Reduce阶段**: - **规约(Reducing)**:Reduce任务负责聚合Map阶段产生的键值对。在WordCount...

    MapReduce学习笔记,亲自测试写出来的,1000分都不贵

    <value>mapreduce_shuffle <name>yarn.nodemanager.resource.memory-mb <value>2048 <name>yarn.nodemanager.resource.cup.vcores <value>1 ``` 这些配置定义了 ResourceManager 的主机名、...

    hadoop源代码存档

    4. MapReduce工作流程:分析job.xml配置文件,理解JobTracker如何解析和调度任务,TaskTracker如何执行任务,以及shuffle和sort过程的实现。 5. 容错机制:探究Hadoop如何实现硬件故障的自动检测和数据恢复,如心跳...

Global site tag (gtag.js) - Google Analytics