MapReduce的编程模型

====
MapReduce

1.MapReduce思想:分而治之
适用于一些大的人物,可以化解成一个个的小任务进行处理。每一个小人物的求解思路与步骤和大任务的求解思路与步骤都一样。
(1)Map负责“分”。即把复杂的任务分解为若干个”简单的任务“来进行处理。
可以拆分的前提是这些小任务可以并行计算,彼此之间没有依赖关系。
(2)Reduce负责“合”。即对map阶段的结果进行全局汇总。

2.MapReduce的编程模型
Map阶段:
(1)读取文件,解析成key, value对。k1,v1
(2)自定义map逻辑,接收k1,v1,转换成新的k2,v2,进行输出。
Shuffle阶段:
(3)分区。相同key的数据发送到同一个reduce里面去,相同的key(即k2)合并,value形成一个集合。
(4)排序
(5)规约
(6)分组
Reduce阶段:
(7)自定义reduce逻辑,接收k2,v2,转换成新的k3,v3,输出。
(8)输出k3,v3,保存起来。
每一个步骤都对应一个java类,然后通过一个job对象将每个步骤组装起来,成为一个job任务,提交到集群上面去运行。


3.Shuffle阶段:
  map阶段的shuffle三个步骤:分区、排序、规约combine
  reduce阶段shuffle一个步骤:分组
  
  map阶段的shuffle三个步骤:分区、排序、规约
  环形缓冲区:maptask产生的数据,都要到环形缓冲区里面来。环形缓冲区就是一个数组,容量是100M,写入数据达到80%容量的时候,开启启动溢写线程。
  maptask的shuffle过程之后,每一条数据都会有一个标记,去往哪一个reducetask。
  map阶段的排序是一个局部的排序,是对每个mapTask处理的数据进行排序。
  规约过程:也是在环型缓冲区里面实现的,将相同key进行合并。
  每一个mapTask都有一个环形缓冲区内存,就是一个数组。数组内存默认100M。数据一直往环形缓冲区里面写入,写到80%的时候,环形缓冲区的数据就会溢写到磁盘里面去。使用一个溢写的线程,将环形缓冲区的数据溢写到磁盘里面去。
  所有的maptask的数据全部溢写完成之后,需要将我们maptask溢写出来的一个个小文件合并成为一个大文件。等待reducetask拉取数据。
  
  
  reduce阶段shuffle一个步骤:分组
  每一个reducetask将所有的属于自己的数据全部拷贝回来之后,进行分组。分组主要就是将相同key合并。继续对数据进行排序。这里的排序是reduce内部的排序,value形成一个集合。调用reduce逻辑。
  注意:这里的排序,相对于maptask端的排序来说,这里是全局的排序,叫做reducetask内部全局的排序。
  reduce拉取map阶段的数据,拉取过来的数据可能保存在三个地方:内存、磁盘、内存+磁盘(使用这种方式)。


4.Reduce阶段:
  reduceTask的个数:reduceTask的并行度job.setNumReduceTasks(4);
  注意:reduceTask个数是我们手动自己指定的。如果不指定,reduceTask的个数就是1个。


5.MapReduce规约combiner
  如果数据在map端就进行一次聚合,那么我们就会在map端将相同key合并,然后发送到reduce端的key的数据量就会变少,加快我们网络拷贝的速度。
  map端将相同key的数据进行聚合,就是combiner做的事情。可以设置combiner的类,实现我们数据在map端进行聚合。
  combiner的写法与reducer的类的写法类似,extends Reducer
  注意:map输出key2,value2,reduce接收输入key2,value2。combiner是夹在map和reduce中间的一个组件。接收:k2,v2,输出:k2,v2。
  规约的输入的数据是map的输出数据,规约输出的数据是reduce的输入数据。


6.MapTask的运行机制
mapTask的并行度:取决于有多少个block块。有一个block块就要启动一个mapTask。

====

 

====
MapReduce的combiner

每一个 map 都可能会产生大量的本地输出,Combiner 的作用就是对 map 端的输出先做一次合并,以减少在 map 和 reduce 节点之间的数据传输量,以提高网络IO 性能,是 MapReduce 的一种优化手段之一。
    combiner 是 MR 程序中 Mapper 和 Reducer 之外的一种组件
    combiner 组件的父类就是 Reducer
    combiner 和 reducer 的区别在于运行的位置:Combiner 是在每一个 maptask 所在的节点运行。Reducer 是接收全局所有 Mapper 的输出结果。
    combiner 的意义就是对每一个 maptask 的输出进行局部汇总,以减小网络传输量。

具体实现步骤:
1、自定义一个 combiner 继承 Reducer,重写 reduce 方法 
2、在 job 中设置:  job.setCombinerClass(CustomCombiner.class)

combiner 能够应用的前提是不能影响最终的业务逻辑,而且,combiner 的输出 kv 应该跟 reducer 的输入 kv 类型要对应起来
====

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值