Hadoop权威指南_读书笔记_第7章 MapReduce的工作机制[面试重点]

一、 MapReduce作业运行机制[面试重点]

二、 Shuffle 和排序[面试重点]

  • MapReduce 确保每个 reducer 的输入都是按键排序的。 系统执行排序,将map输出 作为输入 传给reducer的过程称为 shuffle
    Hadoop权威指南_读书笔记_第7章 MapReduce的工作机制[面试重点]

1. Map端

  • map函数开始产生输出时,并不是简单的将数据写到磁盘,而是先将数据写到一个环形内存缓冲区里面。每个 map 都有一个环形的内存缓冲区用于存储任务的输出。缓冲区大小默认100MB,可以通过mapreduce.task.io.sort.mb参数调整。

  • 一旦缓冲区达到阈值(mapreduce.map.sort.spill.percent,默认80%),一个后台线程就开始把内容溢出到(spill)磁盘

  • 在溢出写磁盘的过程中,map 输出继续写到缓冲区,但如果在此期间缓冲区被填满了,map 会被阻塞直到写磁盘过程完成。

  • 溢出写过程按轮询方式,将缓冲区中的内容写到指定目录。目录路径由mapreduce.local.dir 属性指定。

  • 在写磁盘前,会根据数据最终要传的reducer 把数据划分成相应的分区(partition),在每个分区中,按键key对数据在排序如果指定了combiner函数,在排序后还会对数据做聚合操作,以减少溢写到磁盘的数据量。

  • 每次环形内存缓冲区达到溢出阈值,就会新建一个溢出文件(spill file),map任务运行时会有多个溢出文件,在map任务结束之前,会将溢出文件 合并一个大的 已分区且排序的输出文件,所以一个最终一个map任务对应一个溢出文件

  • 如果溢出文件有3个及其以上(由mapredu.map.combine.minspills设置),combiner函数会在 溢出文件合并成一个文件时再次运行,然后再落到磁盘。如果只有1或者2个溢出文件,就不值得调用combiner(调用combiner也会带来开销)。

2. reduce端

  • 拷贝阶段copy:每个map任务的完成时间不同,因此每个map任务完成时,reduce任务就开始复制map的输出。每个reduce任务拉取对应分区的数据。reduce任务有少量的复制线程,因此能够并行获取map的输出。
  • 合并阶段merge:如果map输出相当小,会被复制到reduce任务的JVM内存缓冲区,否则到达内存缓冲区阈值,就将map输出复制到磁盘 溢写的磁盘之前,会对数据行合并合并后溢写到磁盘中。随着磁盘上的副本增多,后台线程会将他们合并成更大的、排好序的文件
  • 排序阶段sort:复制完所有 map 输出后,reduce 任务进入 排序阶段sort(更恰当的说法是合并阶段,因为排序是在map端进行的),这个阶段 合并map的输出维持其顺序排序
  • reduce阶段:直接将数据传给reduce函数。此阶段的数据直接写到文件系统中去,一般是HDFS。