MR的分片机制

分片机制

分片简介

         Hadoop将MapReduce的MapReduce的输入数据划分为等长的小数据块,
   称之为输入分片(inputSpilt)或者简称“分片”Hadoop为为一个分片构建一
   个单独的map任务,并由该任务来运行用户自定义的map方法,从而处理分片的每一条数据

分片大小的选择

1.	拥有许多分片,每个分片所需时间小于整体的时间
2.	并行处理分片,且每个分片比较小,负载均衡,好的计算机处理更快,可以腾出时间做其他计算
3.	分片太小,管理分片的时间和构建map的时间将会决定整个作业执行使时间
4.	分片跨数据块会使占用带宽效率更低
5.	最佳分片大小应该和HDFS的块大小一致。hadoop2.x默认128M

创建分片的过程

1.获取文件的位置以及大小
2.判断文件是否可以分片(压缩格式有的可以分片,有的不行)
3.获取分片大小
4.剩余文件的大小/分片的大小>1.1时循环封装分片的信息,
	 1.封装一个分片的信息(包含路径,分片的起使偏移量,要处理的大小,分片包含的块信息,分片中包含的块在那些机器上)
	 2.剩余文件<1.1且不为零形成一个分片,hadoop分片允许10%的冗余

读取分片的细节:如果有多个分片

  • 第一个分片读到末尾再多读一行
  •   因为一般来说读到最后一行的时候有很大可能不是正好一行结束因此可以一般要多读取一行。
    
  • 既不是第一个分片也不是最后一个分片第一行数据舍弃,末尾多读一行
  •   舍弃是因为上一个块已经读过了
    
  • 最后一个分片舍弃第一行,末尾多读一行

MapTask的执行流程

MapTask的执行流程 1.根据分片机制将文件分为多个片每个分片对应一个container,map调用FileInputFormat的
getRecordReader读取分片数据
2.MapTask每次读取数据,读取一行返回一个<K,V>键值对,其中K是偏移量,V是一行数据
3.将K,V对叫给MapTask处理,每读取一行就要进行一次MapTask
4.每对键值对调用一次map(K,V,context)方法,然后使用context.write(K,V)写出
5.写出的数据通过收集器OutputCollector.collector()处理
6.写到环形缓冲区中(环形缓冲区默认大小为100M,缓冲区中存储的有原始数据从顺时针方向写入
,将原始数据的偏移量,结束位置,分片请况等逆时针写入环形缓冲区中)
7.当到达阈值默认是80%时开始开始溢写到磁盘,溢写到磁盘时会进行一定的排序)方便使用,并且继续写入剩余的20%若是写满则阻塞。
8默认的分区规则是hashpatitioner,即key的hash%reduceNum
9. 默认的排序规则是key的字典顺序,使用的是快速排序
10. 溢写会形成多个文件,在maptask读取完一个分片数据后,先将环形缓冲区数据刷写到磁盘
11将数据多个溢写文件进行合并,分区内排序(外部排序===》归并排序)

reduce

  1. ReduceTask通过数据分区规则抓取相应的数据到reducetask(通过HTTP协议)
    若是数据小则放在内存暂时存储等待处理,若是抓取的数据过多则需要溢写在磁盘溢写前会进行合,溢写可能会形成多个文件,最终要将文件合并,合并时默认最后合并十个文件
  2. Reduce将多个maptask的数据进行合并,排序
  3. 按照key相同分组()
  4. 一组数据调用一次reduce(k,iterablevalues,context)
  5. 处理后的数据交由reducetask
  6. reducetask调用FileOutputFormat组件
  7. FileOutputFormat组件中的write方法将数据写出
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值