Hadoop生态系统框架详解(三):MapReduce框架

MapReduce入门

1.概念:
Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;
Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
2.优点:
①MapReduce 易于编程:它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 机器运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。 就是因为这个特点使得 MapReduce 编程变得非常流行。
②良好的扩展性:当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
③高容错性:MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上面上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。
④高吞吐量:适合 PB 级以上海量数据的离线处理。这里加红字体离线处理,说明它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce 很难做到。
3.缺点
①实时计算:MapReduce 无法像 Mysql 一样,在毫秒或者秒级内返回结果。
②流式计算:流式计算的输入数据时动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
③DAG(有向图)计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

4.核心思想
①分布式的运算程序往往需要分成至少2个阶段。
②第一个阶段的maptask并发实例,完全并行运行,互不相干。
③第二个阶段的reduce task并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask并发实例的输出。
④MapReduce编程模型只能包含一个map阶段和一个reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个mapreduce程序,串行运行。

5.MapReduce进程
一个完整的mapreduce程序在分布式运行时有三类实例进程:
①MrAppMaster:负责整个程序的过程调度及状态协调。
②MapTask:负责map阶段的整个数据处理流程。
③ReduceTask:负责reduce阶段的整个数据处理流程。

6.MapReduce编程规范
用户编写的程序分成三个部分:Mapper,Reducer,Driver
①Mapper阶段:
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)map()方法(maptask进程)对每一个<K,V>调用一次

②Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法
③Driver阶段
整个程序需要一个Drvier(包含main函数)来进行提交,将自定义 Mapper 和 Reducer 类
组合成一个 job,并提交 job 对象

7.MapReduce进程运行分析
(1)在MapReduce程序读取文件的输入目录上存放相应的文件。
(2)客户端程序在submit()方法执行前,获取待处理的数据信息,然后根据集群中参数的配置形成一个任务分配规划。
(3)客户端提交job.split、jar包、job.xml等文件给yarn,yarn中的resourcemanager启动MRAppMaster。
(4)MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程。
(5)maptask利用客户指定的inputformat来读取数据,形成输入KV对。
(6)maptask将输入KV对传递给客户定义的map()方法,做逻辑运算。
(7)map()运算完毕后将KV对收集到maptask缓存。
(8)maptask缓存中的KV对按照K分区排序后不断写到磁盘文件
(9)MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据分区。
(10)Reducetask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算。
(11)Reducetask运算完毕后,调用客户指定的outputformat将结果数据输出到外部存储。

Hadoop序列化

1.基本概念:
①序列化:序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
②反序列化:反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。

2.常用Hadoop数据序列化类型
①常用数据序列化类型.png
②java类型:boolean,byte,int,float,long,double,string,map,array。
③Hadoop类型:BooleanWritable,ByteWritable,IntWritable,FloatWritable,LongWritable,DoubleWritable,Text,MapWritable,ArrayWritable

3.自定义 bean 对象实现序列化接口(Writable)
自定义 bean 对象要想序列化传输,必须实现序列化接口
①必须实现 Writable 接口。
②反序列化时,需要反射调用空参构造函数,所以必须有空参构造。

public FlowBean() {
   
super();
}

③重写序列化方法

@Override
public void write(DataOutput out) throws IOException {
   
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}

④重写反序列化方法

@Override
public void readFields(DataInput in) throws IOException {
   
upFlow = in.readLong();
downFlow = in
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值