Map
- 从磁盘上读取数据
- 执行map函数
- Partition分区(放进内存)
- Sort排序(内存排序)
- Combine结果(内存预聚合)
- 将结果写到本地的磁盘上
- Merge(对磁盘上的文件合并)
Reduce
- Copy (fetch 拉取数据直接放进内存)
- Merge (内存->磁盘)
- Merge (磁盘->磁盘)
- 执行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 1Partition 2:
My 1
My 1
name 1
Pivotal 1
Tony 1
split 1:
Partition 1:
company 1
is 1
is 1
EMC 1Partition 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格式: <partition> 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
参考文档: