Hadoop序列化和数据输入输出类

Hadoop序列化和数据输入输出类

常用数据序列化类型

Java类型 Hadoop Writable类型
boolean BooleanWritable
byte ByteWritable
int IntWritable
String Text
map MapWritable
array ArrayWritable

Hadoop序列化

序列化就是把内存中的对象转换成字节序列,以便存储到磁盘和网络传输。

反序列化就是把字节序列转换成内存中的对象。

Java序列化是一个重量级序列化框架,一个对象被序列化后,会附带很多额外的信息,不便于网络传输,所以Hadoop自己开发了一套序列化机制(Writable)。

自定义bean对象实现序列化接口

不是所有基本类型都能满足需求,实现bean对象序列化有6步

  1. 实现Writable接口
  2. 反序列化时,需要反射调用空参构造函数
  3. 重写序列化方法
  4. 重写反序列化方法
  5. 重写toString()
  6. 实现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数据输出
  1. 文本输出TextOutputFormat,把每条记录写成文本行,转换为字符串
  2. SequenceFileOutputFormat
  3. 自定义OutputFormat

MapReduce排序

  • 部分排序,根据输入记录的键对排序,保证输出的每个文件内部有序
  • 全排序,输出只有一个文件,但是效率低
  • 辅助排序,GroupComparator,在Reduce端排序
  • 二次排序,在自定义排序中,判断条件为两个

全排序,实现compareTo()类,分区为1即可实现。部分排序,实现partitioner类,分区后自动排序。

Combiner合并

Combiner在MapTask节点运行,Reduce在ReduceTask节点运行。

Combiner局部汇总,减小网络传输量。前提是不能影响业务逻辑。

GroupComparator(辅助排序)

在Reduce阶段对数据分组。

  1. 自定义类继承WritableComparator
  2. 重写compare()方法
  3. 创建一个构造将比较对象传给父类