为了账号安全,请及时绑定邮箱和手机立即绑定

MapReduce 过程

标签:
Spark

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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消