MapReduce内部数据处理流程(未完成)

MapReduce数据处理流程

1、数据来源路径:FileInputFormat.setInputPaths(),输入目录中,可以有单个或多个文件;
2、对原始数据进行处理、任务划分:
(1)任务切片:切片是逻辑切片,非物理切片;
(2)切片大小由输入文件的大小、文件数量和配置参数决定;
(3)(集群中)默认128M一个任务切片,(本地模式)32M一个任务切片;
(4)任务切片逻辑确定maptask数量,每一个输入文件至少有一个切片;每一个切片运行一个maptask;如果文件超过128M(本地模式下32M),同一个输入文件会有多个maptask运行;为减少资源浪费,如果最后一个切片大小小于1.1*128M(或32M),将不会被切分处理。
在这里插入图片描述
3、读取数据:
(1)调用LineRecordReader类中的readLine方法,从输入的切块中读取数据,一次读取一行;
(2)读取到的数据封装成K-V的形式交给xxMapper类;
4、map阶段:
(1)xxMapper类继承Mapper,重写map()方法。
(2)map()方法底层实际上是在一个while循环里,循环的判断条件–>hasnext(),即:有下一个K-V执行一次数据处理,组装成新的K-V。
注:
xxMapper实现类中的四个参数:(两两是一对K-V)
四个参数分别代表:
第一组:输入数据;K:起始位置的偏移量,V:第一行数据;
第二组:输出数据;map端需要的K-V,根据业务需求确定。
5、缓存数组中分区、排序:
(1) 组装好的K-V经由context.write(k,v)方法写出,输出到缓存数组MapOutputBuffer中。
(2)缓存数组对K-V进行分区标识(0,1…)和区内排序。
注:
①何为分区:根据K分区,根据K.hashcode%numberReduceTask进行分区,根据需求获取reducetask个数,获取区号。
②为何分区:map端输出的结果并行被reduce端计算,map端输出结果根据某种规则(或自定义规则)到达某个reducetask中;
分区保证了同一个规则下的K仅被同一个reduce处理,保证数据不能同时到达两个reducetask中;
分区能够保证全部数据被处理,处理的数据不重复。
在这里插入图片描述
6、shuffle数据分发
7、reduce阶段:
(1)从不同的maptask处理的结果数据中获取属于自己分区的数据。
(2)排序。
(3)分组:相同K的聚合在一起,放入迭代器中。
(4)根据相同的K进行聚合,底层也是在循环中,循环的判断条件–>run方法中的context.nextkey(),即:有下一个K执行一次聚合;reduce()方法一组执行一次。
(5)聚合完成,输出结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值