MapReduce 过程

MR 过程图

Map

  1. 从磁盘上读取数据
  2. 执行map函数
  3. Partition分区(放进内存)
  4. Sort排序(内存排序)
  5. Combine结果(内存预聚合)
  6. 将结果写到本地的磁盘上
  7. Merge(对磁盘上的文件合并)

Reduce

  1. Copy (fetch 拉取数据直接放进内存)
  2. Merge (内存->磁盘)
  3. Merge (磁盘->磁盘)
  4. 执行reduce函数

word count 例子

假如有一个文件,被切分成两个split (也就是有两个map task)

split 0:
My name is Tony
My company is Pivotal

split 1:
My name is Lisa
My company is EMC

执行map函数

split 0:
My 1
name 1
is 1
Tony 1
My 1
company 1
is 1
Pivotal 1

split 1:
My 1
name 1
is 1
Lisa 1
My 1
company 1
is 1
EMC 1

Partition分区(放进内存)

  • 为什么要分区 ?
    一个分区对应一个Reduce
    当数据量多的时候,一个Reduce处理不了这么多数据,这时需要更多

假设这里有2个分区

split 0:

Partition 1:
company 1
is 1
is 1

Partition 2:
My 1
My 1
name 1
Pivotal 1
Tony 1

split 1:

Partition 1:
company 1
is 1
is 1
EMC 1

Partition 2:
My 1
My 1
name 1
Lisa 1

Partition的结果(属于哪个reduce) 都会被写入内存缓冲区进行Sort操作

Sort排序(内存排序)

  • 环形缓冲区
    内存缓冲区默认大小限制为100MB,它有个溢写比例(spill.percent),默认为0.8,当缓冲区的数据达到阈值时,溢写线程就会启动,先锁定这80MB的内存,执行溢写过程,maptask的输出结果还可以往剩下的20MB内存中写,互不影响。
  • 排序
    Partition的结果写入内存缓冲区后,当缓冲区的数据达到一定的量的时候,会进行spill to disk(溢写)过程, 在溢写之前,先会对这些数据进行Sort排序操作 (先对partition,再对key排序)

接着例子说明(split格式: key value):

split 0:
<1> company 1
<1> is 1
<1> is 1
<2> My 1
<2> My 1
<2> name 1
<2> Pivotal 1
<2> Tony 1

split 1:
<1> company 1
<1> is 1
<1> is 1
<1> EMC 1
<2> My 1
<2> My 1
<2> name 1
<2> Lisa 1

Combine结果(内存预聚合)

假如程序中设置了Combine,在溢写之前,先会对这些数据进行Sort排序,再进行Combine操作

split 0:
<1> company 1
<1> is 2
<2> My 2
<2> name 1
<2> Pivotal 1
<2> Tony 1

split 1:
<1> company 1
<1> is 2
<1> EMC 1
<2> My 2
<2> name 1
<2> Lisa 1

溢写操作,在磁盘生成排序后的文件

spill to disk

Merge(对磁盘上的文件合并)

当同一个Map操作溢写的文件大于一个,那要进行Merge操作,确保Map任务最后生成一个中间文件

Copy (fetch 拉取数据直接放进内存)

之前假设有2个partition分区,所以现在有2个reducer进行拉取数据操作
Reducer 1 拉取所有Partition1的文件内容

company 1
is 2
company 1
is 2
EMC 1

Reducer 2 拉取所有Partition2的文件内容

My 2
name 1
Pivotal 1
Tony 1
My 2
name 1
Lisa 1

Merge (内存->磁盘)

Copy过来的数据会先放入内存缓冲区中,当内存中的数据量到达一定阈值,就启动内存到磁盘的 merge
和Map段的溢写过程很类似,会进行Sort排序

Reducer 1:
company 1
company 1
is 2
is 2
EMC 1

Reducer 2:
My 2
My 2
name 1
name 1
Pivotal 1
Tony 1
Lisa 1

Merge (磁盘->磁盘)

当溢写的文件过多的时候,也会进行Merge操作,防止磁盘生成的文件过多

执行reduce函数

Reducer 1:
company 2
is 4
EMC 1

Reducer 2:
My 4
name 2
Pivotal 1
Tony 1
Lisa 1

Map
Reduce

参考文档:

MapReduce之Shuffle过程详述
官方文档
MapReduce过程详解及其性能优化

猜你喜欢

转载自blog.csdn.net/xw514124202/article/details/81410554
今日推荐