一、 简单理解MapReduce
MapReduce编程核心思想
1、 Map阶段: 分数据处理,将文件按照某种规则进行切片,一个切片一个Map任务,在MapReduce中可以有多个Map任务
不同的Map任务可以运行在不同的节点上,进行分布式运行
2、 Reduce阶段: 合数据处理,将map阶段处理的数据结果进行汇总,计算出最终的结果,reduce处理的可能是多个Map任务的处理结果,所以reduce比较浪费资源,因此reduce阶段能不存在就不存在
MapReduce启动后存在的进程
1、 MRApplicationMaster ----监控整个MR程序的运行状态,以及向RM申请资源
2、 MapTask ----负责运行map阶段的计算逻辑
3、 ReduceTask ----负责运行reduce阶段的计算逻辑
二、 MapReduce的序列化机制
原因
MapReduce处理的数据是多种多样的,在这个过程中就会涉及到网络传输,而在网络中传输的数据都是以二进制的形式进行传输,当MapReduce处理的数据为对象时,是无法在网络中传输的,所以需要对MapReduce中的数据进行序列化。
在实现序列化机制时必须使用Hadoop自带的序列化机制,不能使用java的序列化机制,原因是java的序列化机制太重了,在java中当一个对象被序列化时,会附带很多信息,包括校验信息,继承体系等,不便于在网络中传输。
特点
快速,可扩展,紧凑,互操作
自定义javabean对象步骤
1、 继承Writable
2、 反序列化时需要反射调用空参构造函数,所以需要有空参构造器
3、 重写序列化方法
4、 重写反序列化方法
5、 反序列化顺序需要和序列化顺序一致
6、 如果需要将内容显示到文件中,需要重写toString方法
7、 如果需要将自定义的bean放到key中传输,还需要实现comparable接口
三、 MapReduce的文件输入InputFormat
InputFormat主要用来做两件事
- 将文件切片
- 将文件转换成key-value形式
InputFormat是一个抽象类,在下面通过两个方法来实现这两件事
- getSplits
- RecordReader
InputFormat常用的,在MR程序中默认使用的子类是FileInputFormat,FileInputFormat也是一个抽象类,其下主要有五个实现子类,同时也可以自定义实现子类
1、 TextInputFormat(FlieInputFormat的默认实现子类)
- 切片机制
1、 先获取输入文件的状态FileStatus
2、 如果有多个文件,每个文件单独切片
3、 在切片之前,判断文件是否能被切割(像压缩包一般是不能被切割的,bzip除外)
4、 如果文件能被切割,就按照公式进行切割 Math.max(minsize, Math.min(maxsize, blocksize))
先求出maxsize和blocksize的最小值
然后用最小值和minsize求出最大值,最大值为切片的大小
minsize和maxsiz