MapReduce 任务执行过程

MapReduce的执行过程主要包含是三个阶段:Map阶段、Shuffle阶段、Reduce阶段


MapReduce 任务执行过程_第1张图片
MapReuce 过程分解

Map 阶段

  • split: 会将输入的大文件 split 成一个 HDFS 的 block,每个 map 处理一个 block 的数据
  • map:对输入分片中的每个键值对调用map()函数进行运算,然后输出一个结果键值对

Partitioner:对 map 的输出进行partition,即根据key或value及reduce的数量来决定当前的这对键值对最终应该交由哪个reduce处理。默认是对key哈希后再以reduce task数量取模,默认的取模方式只是为了避免数据倾斜。这个 partition 过程可以通过指定 partitioner 自定义

  • sort:在溢写到磁盘之前,使用快排对缓冲区数据按照partitionIdx, key排序。(每个partitionIdx表示一个分区,一个分区对应一个reduce)

Combiner:如果设置了Combiner,那么在Sort之后,还会对具有相同key的键值对进行合并,减少溢写到磁盘的数据量。

  • spill: map输出写在内存中的环形缓冲区,默认当缓冲区满80%,启动溢写线程,以 round-robin的方式将缓冲的数据写出到 mapreduce.cluster.local.dir 指定的目录磁盘
  • merge:溢写可能会生成多个文件,这时需要将多个文件合并成一个文件。合并的过程中会不断地进行 sort & combine 操作,最后合并成了一个已分区且已排序的文件

Shuffle阶段

广义上Shuffle阶段横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和merge/sort过程。通常认为Shuffle阶段就是将map的输出作为reduce的输入的过程

  • Copy:Reduce端启动一些copy线程,通过HTTP方式将map端输出文件中属于自己的部分拉取到本地。Reduce会从多个map端拉取数据,并且每个map的数据都是有序的。
  • Merge:Copy过来的数据会先放入内存缓冲区中,这里的缓冲区比较大;当缓冲区数据量达到一定阈值时,将数据溢写到磁盘(与map端类似,溢写过程会执行 sort & combine)。如果生成了多个溢写文件,它们会被merge成一个有序的最终文件。这个过程也会不停地执行 sort & combine 操作。

Reduce阶段

  • reduce:Shuffle阶段最终生成了一个有序的文件作为Reduce的输入,对于该文件中的每一个 调用reduce()方法,并将结果写到HDFS

你可能感兴趣的:(MapReduce 任务执行过程)