MapReduce的输入输出机制

       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过程提供尽量多的内存空间,避免多次溢出写磁盘,让数据常驻内存都有利于性能的提高.

猜你喜欢

转载自liudeh-009.iteye.com/blog/1478056