分享

彻底了解mapreduce核心Shuffle--解惑各种mapreduce问题

 
hyj 发表于 2014-3-7 21:55:06 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 50 164965
提示: 作者被禁止或删除 内容自动屏蔽

本帖被以下淘专辑推荐:

已有(51)人评论

跳转到指定楼层
pig2 发表于 2014-3-7 22:12:27
本帖最后由 nettman 于 2014-3-8 00:07 编辑
个人观点仅供参考:
Shuffle产生的意义是什么?

Shuffle过程的期望可以有:
完整地从map task端拉取数据到reduce 端。
在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
减少磁盘IO对task执行的影响。

每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据该如何处理?

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


MapReduce提供Partitioner接口,它的作用是什么?

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

什么是溢写?

在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。


溢写是为什么不影响往缓冲区写map结果的线程?

溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。


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

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



溢写过程中如果有很多个key/value对需要发送到某个reduce端去,那么如何处理这些key/value值?

如果有很多个key/value对需要发送到某个reduce端去,那么需要将这些key/value值拼接到一块,减少与partition相关的索引记录。



哪些场景才能使用Combiner呢?

Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。

Merge的作用是什么?

最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,当map执行完成时,只会产生一个溢写文件),因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge

每个reduce task不断的通过什么协议从JobTracker那里获取map task是否完成的信息?

每个reduce task不断地通过RPC从JobTracker那里获取map task是否完成的信息


reduce中Copy过程采用是什么协议?

Copy过程,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件。


reduce中merge过程有几种方式?
merge有三种形式:1)内存到内存  2)内存到磁盘  3)磁盘到磁盘。默认情况下第一种形式不启用,让人比较困惑,是吧。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的那个文件。




回复

使用道具 举报

hyj 发表于 2014-3-7 21:57:57
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

阿飞 发表于 2014-4-22 17:56:03
天宇 发表于 2014-4-22 17:01
飞哥,我想问下,Combiner 过程是 属于map阶段还是属于reduce阶段?有的书上面说只有map阶段才有combiner过 ...

个人理解:
combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。
combiner的目的是减少map网络流量。
combiner的对象是对于map
combiner具有和reduce相似的功能。
只不过combiner合并对象,是对于一个map。
reduce合并对象,是对于多个map。

回复

使用道具 举报

471505881qq 发表于 2014-4-1 15:32:22

要留着备用。
回复

使用道具 举报

Hedera 发表于 2014-10-7 11:01:59
gtchen 发表于 2014-5-5 16:53
请教个问题,这里说   “当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默 ...

这个是排序的一种思想----合并排序。先进行小范围排序,最后再大范围排序。最后的复杂度为O(nlog(n)),比普通排序复杂度O(n的平方)快。
回复

使用道具 举报

2322292960 发表于 2014-3-8 08:42:13
这个真的不错啊
回复

使用道具 举报

471505881qq 发表于 2014-4-1 11:39:35

谢谢楼主的分享!
回复

使用道具 举报

hyj 发表于 2014-4-20 17:35:40
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

howtodown 发表于 2014-4-20 17:36:28
hyj 发表于 2014-4-20 17:35
map和reduce都有合并,在map中,是先分区,在合并,还是先合并在分区

个人认为是先分区后合并。
回复

使用道具 举报

天宇 发表于 2014-4-22 17:01:33
飞哥,我想问下,Combiner 过程是 属于map阶段还是属于reduce阶段?有的书上面说只有map阶段才有combiner过程。求解答,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条