MapReduce确保每个reducer的输入都按键排序.将map的输出作为输入传给reducer的过程称为shuffle,学习shuffle是如何工作的有助于我们更好的理解MapReduce
每个Map任务都有一个内存缓冲区,用于存储任务的输出,默认情况下缓冲区的大小为100MB,一旦缓冲区内容达到阙值(默认0.8),一个后台线程便会把内容写到磁盘.在写磁盘的过程中,map输出继续被写到缓冲区,但此时如果缓冲区被填满,map会阻塞直到写磁盘过程完成.
在写磁盘之前,线程还会根据最终要传送的reducer把数据划分成相应的分区,并对每个分区进行内排序,如果有一个combiner,它会在排序后的输出上运行.运行combiner的意义在于使map输出更紧凑,使得写到本地磁盘和传给reducer的数据更少.
写磁盘时压缩map的输出会让写磁盘的速度更快,节约磁盘空间,并减少传给reducer的数据量.用于文件分区的工作线程的设置是针对每个tasktracker,而不是针对map任务槽,默认为40
reducer端通过http方式得到输出文件的分区.一般情况下,reduce任务需要集群上若干个map任务的map输出作为其输入.每个map任务完成时间不同,因此只要有一个map任务完成,reduce任务就开始复制其输出,reduce任务有少量复制线程,默认为5.由于reduce任务有可能失败,因此tasktracker并不会在第一个reducer检索到map输出时就立即从磁盘上删除它们,而是等jobtracker通知作业完成后执行删除操作的.
如果map输出相当小则直接复制到reduce的内存,不需要写磁盘.随着磁盘上的副本越来越多,后台线程会将它们合并为更大的,排好序的文件,为了合并,压缩的map输出都必须在内存中被解压缩,
复制完map输出,reduce任务进行排序阶段,这个阶段会合并map输出,维持其顺序排序.如果有50个map输出,而合并因子为10,合并将进行5趟,每趟将10个文件合并成一个文件,因此最后有5个中间文件.最后直接把数据输入reduce函数,从而省略了一次磁盘往返行程,没有将5个文件合并一趟.
在reduce阶段,.对已排序的每个键都调用reduce函数,此阶段的输出直接输出到文件系统,一般为HDFS.由于tasktracker也是存储数据的节点,因此reduce输出的第一个块副本将会写到本地磁盘.
理解shuffle的过程对MapReduce的调优非常有好处.从上可以看出,为shuffle过程提供尽量多的内存空间,避免多次溢出写磁盘,让数据常驻内存都有利于性能的提高.
mapreduce实现map输出 mapreduce的输入和输出
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
mapreduce 直接输出 mapreduce的输入和输出
MapReduce的输入和输出MapReduce框架运转在<key,value>键值对上,也就是说,框架把作业的输入看成是一组<key,value>键值对,同样也产生一组<key,value>键值对作为作业的输出,这两组键值对可能是不同的。一个MapReduce作业的输入和输出类型如下图所示:可以看出在整个标准的流程中,会有三组<key,value>
mapreduce 直接输出 MapReduce的输入输出和处理流程 MapReduce 键值对 数据 -
Java HeapSize上限
敲代码渐渐的成为了一种快乐的事情,尤其的尤其是:别人不会,而咱会。心里那种优越感要比其他事情来的猛烈许多。更尤其的是,给别人排错的时候轻而易举的搞定错误,在别人羡慕的眼神中低调的说:没什么,刚好我遇到过这个问题。。。你们知道,那是怎样的一种快乐么?好吧,进一步的暴露出我是一个多么虚荣加虚伪的人。 今天就记下帮别人改的几个小错误:第一个是myeclipse的工作空间出了问题,总是提示bu
Java HeapSize上限 java javaweb myeclipse 错误 常见错误 eclipse