Java序列化
序列化是把 内存中的对象,转换成 二进制的字节数组,便于存储到磁盘(持久化)和网络传输。
反序列化就是将 二进制的字节数组,转换成内存中的对象。
作用
java对象只在内存中,关机断电就没有了,不能持久化,也不能发送到其他计算机使用
hadoop 与 java序列化
hadoop是分布式服务,由 n 台服务器组成,MapReduce程序 序列化后,发送到 各个服务器运行
在 wordcount程序中,使用的 IntWritable、LongWritable、Text 等,就是序列化类型
没有使用 Java的序列化
Java的序列化是一个 重量级 序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承等),不便于在网络中高效传输
hadoop序列化
Hadoop开发了一套序列化机制:Writable 接口,提高效率,复用对象
当某个类需要在 hadoop中序列化时,需要实现 Writable 接口
序列化接口 Writable 源码
public interface Writable {
//序列化时重写此方法
void write(DataOutput out) throws IOException;
//反序列化时重写此方法
void readFields(DataInput in) throws IOException;
}
序列化接口 WritableComparable
因为 MapReduce 中的 Shuffle 过程要求 key 必须能排序
所以将 序列化对象 作为key时,还需要再实现 Comparable 接口
也可以只实现 WritableComparable 接口,该接口继承 Writable, Comparable接口
hadoop 序列化类型
| Java类型 | Hadoop Writable类型 |
|---|---|
| Boolean | BooleanWritable |
| Byte | ByteWritable |
| Int | IntWritable |
| Float | FloatWritable |
| Long | LongWritable |
| Double | DoubleWritable |
| String | Text |
| Map | MapWritable |
| Array | ArrayWritable |
| Null | NullWritable |
hadoop序列化类型,与 java类型一一对应,大部分名字都与 java类型名相同,后缀是 Writable
这些序列化类型都实现了 WritableComparable 接口,即:可以作为key使用