MapReduce知识点整理
基于版本:Hadoop 2.7.2
序列化
Q: 为什么Hadoop不使用Java自带的序列化?
A: Java自带的序列化框架过于重量级(附带很多额外信息:校验信息、Header、继承体系等),网络传输效率低,所以Hadoop自己实现了序列化机制(Writable
接口).
自定义可序列化类
- 实现
Writable
接口 - 反序列化用到反射,需要调用无参数构造方法,因此自定义的可序列化类需要有无参数构造方法
- 重新
write
方法(序列化)和readFields
方法(反序列化),注意序列化和反序列化时字段顺序需要保持一致 - Hadoop的shuffle过程会对键排序,因此如果需要自定义的可序列化类对象作为键,还需要实现
WritableComparable
接口 - 如果对象需要作为reduce的输出写入文件,需要重写
toString
方法实现其字符串形式的表示,一般采用\t
将字段分开的形式,便于之后的MapReduce任务读取
InputFormat
InputFormat
抽象类InputFormat
是输入格式的基类,主要实现了两个功能:
- 将输入文件切片
- 从切分读入键值对序列
FileInputFormat
FileInputFormat
是针对文件输入的抽象类,主要处理文件切片逻辑- 按输入文件长度切片,默认的切片大小等于
BlockSize
,对于每个输入文件单独切分而不是合并切片 splitSize = Math.max(minSize, Math.min(maxSize, blockSize))
- 通过设置
mapreduce.input.fileinputformat.split.minsize
(默认值为1
)大于BlockSize
,让切片变大 - 通过设置
mapreduce.input.fileinputformat.split.maxsize
(默认值为Long.MAX_VALUE
)小于BlockSize
,让切片变小 - 细节:将文件切片时,每次判断剩余文件大小是否大于切片大小的1.1倍,如果是,则新建切片
TextInputFormat
- 默认的输入格式实现类
- 按行读取文件
- 键:存储在整个文件中的起始字节偏移量,
LongWritable
类型 - 值:本行内容,不包含换行符和回车符,
Text
类型