常用数据序列化类型
Java类型 | Hadoop Writable类型 |
---|---|
boolean | BooleanWritable |
byte | ByteWritable |
int | IntWritable |
String | Text |
map | MapWritable |
array | ArrayWritable |
Hadoop序列化
序列化就是把内存中的对象转换成字节序列,以便存储到磁盘和网络传输。
反序列化就是把字节序列转换成内存中的对象。
Java序列化是一个重量级序列化框架,一个对象被序列化后,会附带很多额外的信息,不便于网络传输,所以Hadoop自己开发了一套序列化机制(Writable)。
自定义bean对象实现序列化接口
不是所有基本类型都能满足需求,实现bean对象序列化有6步
- 实现Writable接口
- 反序列化时,需要反射调用空参构造函数
- 重写序列化方法
- 重写反序列化方法
- 重写toString()
- 实现Comparable接口
MapReduce框架原理
InputFormat数据输入
MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。
数据块:Block是在HDFS上物理的把数据切成一块一块。数据切片:split是逻辑上对输入切片。
一个Job的Map阶段并行度,即Map个数是由客户端提交Job的切片数决定的。每一个split切片分配一个MapTask并行处理。默认情况下切片大小等于块大小。
如果有很多小文件,就会产生大量的Maptask,处理效率低,这时候就可以用CombineTextInputFormat,可以将多个小文件从逻辑上规划到一个切片中,多个小文件交给一个MapTask处理。
FileInputFormat实现类
FileInputFormat常见的接口实现类包括:TextInputFormat,KeyValueTextInputFormat,NLineInputFormat,CombineTextInputFormat。
- TextInputFormat类是默认的FileInputFormat实现类,按行读取每条记录,键是存储该行在整个文件中的起始字节偏移量,LongWritable类型,值是这行的内容。
- KeyValueTextInputFormat,每一行为一条记录,(line1,line1的内容)
OutputFormat数据输出
- 文本输出TextOutputFormat,把每条记录写成文本行,转换为字符串
- SequenceFileOutputFormat
- 自定义OutputFormat
MapReduce排序
- 部分排序,根据输入记录的键对排序,保证输出的每个文件内部有序
- 全排序,输出只有一个文件,但是效率低
- 辅助排序,GroupComparator,在Reduce端排序
- 二次排序,在自定义排序中,判断条件为两个
全排序,实现compareTo()类,分区为1即可实现。部分排序,实现partitioner类,分区后自动排序。
Combiner合并
Combiner在MapTask节点运行,Reduce在ReduceTask节点运行。
Combiner局部汇总,减小网络传输量。前提是不能影响业务逻辑。
GroupComparator(辅助排序)
在Reduce阶段对数据分组。
- 自定义类继承WritableComparator
- 重写compare()方法
- 创建一个构造将比较对象传给父类