分布式计算系统MapReduce

1. 理解MapReduce的思想

MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。
Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce负责“合”,即对map阶段的结果进行全局汇总。
这两个阶段合起来正是MapReduce思想的体现。
在这里插入图片描述

2. MapReduce执行流程

1:按照行读取文件数据:使用FileInputFormat类,会自动将每一行数据转成一个键值对:K1和V1
2:我们需要自己写代码:继承Mapper类,重写map方法,将之前的K1和V1转为K2和V2
3:K2和V2会自动进入Shuffle阶段:分区,排序,Combiner,分组
4:经过Shuffle阶段的数据是:K2,[V2] 也称为:新K2,V2
5:我们需要自己写代码:继承Reducer类,重写reduce方法,将之前K2,[K2]转为K3和V3
6:将输出的K3和V3写入文件

3.MapReduce编程步骤

1:写Map阶段代码:继承Mapper类,重写map方法,将之前的K1和V1转为K2和V2
2:写Reduce阶段代码:继承Reducer类,重写reduce方法,将之前K2,[K2]转为K3和V3
3:编写主类,写main方法,将所有的执行步骤转成job任务提交给yarn执行
4:测试运行

JobMain:

1、创建建一个job任务对象
2、指定job所在的jar包
3、指定源文件的读取方式类和源文件的读取路径
4、指定自定义的Mapper类和K2、V2类型
5、指定自定义分区类(如果有的话)
6、指定自定义Combiner类(如果有的话)
7、指定自定义分组类(如果有的话)
8、指定自定义的Reducer类和K3、V3的数据类型
9、指定输出方式类和结果输出路径
10、将job提交到yarn集群

所以MapReduce 核心 确定好 K1,V1; K2,V2

4. MapReduce中Split和Block的对应关系

1:block是HDFS的物理切分
2:split是MapReduce的逻辑切分
3:默认情况下,一个block就对应一个split,但是如果出现同一行跨block问题,则split会根据实际情况灵活调整

5. MapReduce核心阶段 shuffle

5.1 shuffle分区
1:分区就是对K2和V2的键值对打标记
2:打了同一个标记的数据,你们就属于同一个分,会被同一个Reduce读取
分区的目的就是对源数据进行分类管理
1:编写Mapper类代码,继承Mapper,重写map方法
2:编写自定义分区类代码,告诉MR我的分区规则
    自定义类类继承Partitioner类
3:编写Reducer类代码
4:编写主类代码,指定分区类,其中Reduce个数要设置为2
5.2 shuffle序列化和排序
序列化:
1:如果你自定义一个类(JavaBean类),则这个类必须能够被序列化和反序列
2:要想让自定义类能够被序列化或者反序列化,则必须实现一个接口:Writable ,重写其中的两个方法;
public interface  Writable {
 void write(DataOutput out) throws IOException;
 void readFields(DataInput in) throws IOException;
}

排序:
1:MapReduce为了让我们类的既能够进行序列化,又能够进行排序,他定义了一个Writable的子接口:WritableComparable
public class SortBean implements WritableComparable<SortBean> {
}
2:MapReduce都是根据K2进行排序,排序的字段必须包含在K2中
3:MapReduce中如果有自定义类,则向结果文件写数据时,会调用toString方法
5.2 Combiner
1:对Map端接口进行一次局部合并,减少Map端和Reduce数据的传输量,是 MapReduce 的一种优化手段之一,提高网络IO传输的性能
2:Combiner其实就是将Reducer要做的事情提前放在Map端先做一次
3:Combiner的代码和Reduce的代码基本一样,就是将Reduce的代码在每一个Map之后执行一次即可
编写代码
	1:编写Mapper类代码:和单词统计案例代码一样
	2:编写Combiner类代码,该代码除了类名,其他的代码和Reducer代码一样
	3:编写Reducer代码,和单词统计案例一样
	4:编写主类代码,指定Combiner类的Class对象
       job.setCombinerClass(MyCombiner.class);
Combiner和Reducer区别
	Combiner 是在每一个 maptask 所在的节点运行
Reducer 是接收全局所有 Mapper 的输出结果
combiner 的意义就是对每一个 maptask 的输出进行局部汇总,以减小网络传输量
分组
意义:
	相同K2的数据,它的Value会被放到同一个集合
位置:
	分组可以理解为在Reduce端
自定义分组:
	1:默认情况下,只有K2相同,才能分到同一组,value放到同一个集合
	2:有时候为了分析需求,需要将不同K2的数据也放到同一组
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值