MapReduce入门
-
概述
-
定义:MapReduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。
MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
-
优缺点:
- 优点:易于编程,良好的扩展性,高容错性,海量数据的离线处理
- 缺点:不擅长实时计算、不擅长流式计算、不擅长DAG(有向图)计算
-
核心思想
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJ8N0Uvy-1576121351172)(C:\Users\lhx\Desktop\课程资料\Markdow笔记\Hadoop\Maprudce的思想.png)]
-
MapReduce进程:一个完整的MapReduce程序在分布式运行时有三类实例进程
- MrAppMaster:负责整个程序的过程调度以及状态调度
- MapTask:负责Map阶段的整个数据处理流程
- ReduceTask:负责Reduce阶段的整个数据的汇总、处理。
-
编程规范:用户编写的程序分成三个部分:Mapper、Reducer和Driver。
Mapper阶段
- 用户自定义的Mapper要继承自己的父类
- Mapper的输入数据时KV对的形式
- Mapper中的业务逻辑写在map()方法中
- Mapper的输出数据KV对像是
- Map()方法对每一个KV调用一次
Reducer阶段
- 自定义Reducer继承自己的父类
- Reducer输入数据类型和Mapper的输出类型所对应
- 处理数据的业务逻辑写在reduce()方法中
- ReduceTask进程对每个相同的KV调用一次
Driver阶段
- 相当于YARN集群的客户端,用于提交整个程序到集群中,提交的时封装lMapReduce程序相关运行参数的job对象
-
-
Hadoop序列化
-
概述:序列化是把内存中的对象,转换成字节序列数据(或者其它协议的数据),以便存储在磁盘上(持久化)或者在网络上传输.
反序列化是把字节序列数据,转换成对象.是序列化的逆向过程.比如把持久化到磁盘上的字节数据或者从网络上接收到的已序列化字节数据转换成对象.
-
特点:
(1) 紧凑:高效使用存储空间。
(2) 快速:读写数据的额外开销小。
(3) 可扩展:随着通信协议的升级而可升级。
(4) 互操作:支持多语言的交互。
-
自定义bean对象实现序列化接口
具体实现bean对象序列化步骤如下7步。 (1)必须实现Writable接口 (2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造 public FlowBean() { super(); } (3)重写序列化方法 @Override public void write(DataOutput out) throws IOException { out.writeLong(upFlow); out.writeLong(downFlow); out.writeLong(sumFlow); } (4)重写反序列化方法 @Override public void readFields(DataInput in) throws IOException { upFlow = in.readLong(); downFlow = in.readLong(); sumFlow = in.readLong(); } (5)注意反序列化的顺序和序列化的顺序完全一致 (6)要想把结果显示在文件中,需要重写toString(),可用”\t”分开,方便后续用。 (7)如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的Shuffle过程要求对key必须能排序。详见后面排序案例。 @Override public int compareTo(FlowBean o) { // 倒序排列,从大到小 return this.sumFlow > o.getSumFlow() ? -1 : 1; }
-
序排列,从大到小
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}
```