继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

MapReduce 过程

慕村9548890
关注TA
已关注
手记 1296
粉丝 227
获赞 991

webp

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格式:  <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

webp

Map


webp

Reduce



作者:阿武z
链接:https://www.jianshu.com/p/b32a7cca3efe


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP