MapReduce整个流程的理解

1客户端(切片清单)

job 要做五件事 最重要的是第二件
在这里插入图片描述

2map输入数据
利用lineRecordRedurer 方法做行读取器

一个切片的的信息:
file:来自的文件
start: 偏移量
length: 大小
hosts: 位置信息

在这里插入图片描述

1 map输入对hdfs拿一个输入流 seek()方法 到自己map的偏移量位置 这样就不会读到其他map

2 调整切片的偏移量向下边多读一行 (分割块时把信息分割开了,用这个方法把信息调整完整)

3洗牌
在这里插入图片描述

洗牌包括 map输出数据 和reduce 拉取数据
但是源码中 是reduce拉取数据的过程

1 map输出数据

主要工作的的是mapoutputbuffer
在这里插入图片描述
首先调用write(k,v)方法 但底层 会多传一个叫p的分区信息

根据hash得到一个值用来代表partition 但会打乱数据的逻辑
所以一般在客户端设置

这五个步骤在init方法中
1 得到的数据会写在内存中的buffer缓冲区
默认是100mb大小 (可以调优增加速度) 占用80%会写到磁盘
在buffer中 每对k,v要存进buffer内要确定他的位置就要有索引 那么就会在buffer的后边开辟一个
16b大小的空间来记录他的信息 分为 四部分
1 key的起始位置
2 value的起始位置
3 value的结束位置
4 p 这条数据的分区信息

    这是一个环形的缓冲区

在这里插入图片描述

2 在内存中进行快速排序

这是整个排序唯一次从乱序变成有有序的过程 唯一一次用到快排

3 用到比较器
在源码中 看 用户有没有自己编写比较器 如果有编写就用编写的 如果没有就用源码自身带的 (字典序 和数值序 )

4 conbiner–处理本map的数据
在这里插入图片描述
用于压缩文件 相同的数据合并起来 减少reduce拉取数据I/o时间
conbiner 是处理本map中的数据

第一次conbiner是缓冲区写完一个80%排序时触发一次,压缩文件 写到磁盘

当多个写完多个的时候(即溢写数量超过3的时候)会再次触发conbiner合并相同的数据

生成的多个文件 先按分区排序,再按key排序
5 溢写 和线程
8%的数据写满 进行排序输出的过程 要给20%的大方开始写数据

最后有一个flash的方法 把一个个小文件合并成一个大文件

洗牌的主要目的:
解决 磁盘I/O 网络I/O传输速度问题

2 reduce拉取数据

map的输出和reduce的输入时并行的
例如有100map 弄好30个后 reduce先拉取过来 然后map和reduce各自工作

reduce强依赖map排序的结果分组

存在buffer缓冲区

进行归并排序

比较器 :
看用户有没有做分组比较器
再看快排时有没有自己做做比较器
然后再用系统自己的比较器

真假迭代器:
在这里插入图片描述

reduce迭代的过程:
读一行 同时判断下一行是不是和自己的key相同
当读到和下一行的的key不同时 就能判断一组

所以这个过程基本不消耗内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值