深入MapReduce

深入MapReduce

mapreduce的输入和输出

mapreduce运行在<K,V>键值对上,在mapreduce流程中,会有三组键值对

mapreduce运行流程图

map的运行流程

第一阶段:根据输入目录中的文件的大小,进行逻辑分片(默认情况下,Split size = Block size = 128M

Hadoop2.X后的块大小)每个切片由一个maptask处理。

第二阶段:把切片中的每行内容处理成键值对,K1对应每行的偏移量,V1对应每行的内容。

第三阶段:调用map方法,把传入的每一个键值对处理成(K2,V2)。

第四阶段:按照一定的规则对第三阶段输出的键值对进行分区。默认是只有一个区。分区的数量就是 Reducer 任务运行的数量。默认只有一个Reducer 任务。

第五阶段:对每个分区中的键值对进行排序。首先,按照键的字典序进行排序,对于键相同的键值对,按照值进行排序。

第六阶段:是对数据进行局部聚合处理,也就是 combiner 处理。键相等的键值对会调用一次 reduce 方法。经过

这一阶段,数据量会减少。本阶段默认是没有的。

reduce的运行流程

第一阶段:Reducer 任务会主动从 Mapper 任务复制其输出的键值对。Mapper 任务可能会有很多,因此 Reducer 会复制多个 Mapper 的输出。

第二阶段:复制到 Reducer 本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。

第三阶段:对排序后的键值对调用 reduce 方法。键相等的键值对调用一次reduce 方法,每次调用会产生零个或

者多个键值对。最后把这些输出的键值对写入到 HDFS 文件中。

Mapreduce 的分区—Partitioner

Mapreduce 中会将 map 输出的 kv 对,按照相同 key 分组,然后分发给不同的 reducetask。

默认的分发规则为:根据 key 的 hashcode%reducetask 数来分发 所以:如果要按照我们自己的需求进行分组,

则需要改写数据分发(分组)组件 Partitioner,自定义一个 CustomPartitioner 继承抽象类:Partitioner,然后在job 对象中,设置自定义 partitioner:job.setPartitionerClass(CustomPartitioner.class)

Mapreduce 的 combiner

每一个 map 都可能会产生大量的本地输出,Combiner 的作用就是对 map 端的输出先做一次合并,以减少在 map 和 reduce 节点之间的数据传输量,以提高网络 IO 性能,是 MapReduce 的一种优化手段之一。

  1. combiner 是 MR 程序中 Mapper 和 Reducer 之外的一种组件
  2. combiner 组件的父类就是 Reducer
  3. combiner 和 reducer 的区别在于运行的位置:Combiner 是在每一个 maptask 所在的节点运行,Reducer 是接收全局所有 Mapper 的输出结果。
  4. combiner 能够应用的前提是不能影响最终的业务逻辑,而且,combiner 的输出 kv 应该跟 reducer 的输入 kv 类型要对应起来
  5. 具体实现步骤:
    1、自定义一个 combiner 继承 Reducer,重写 reduce 方法
    2、在 job 中设置: job.setCombinerClass(CustomCombiner.class)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值