一、做为一种 持久化格式 。
二、做为一种 通讯的数据格式 。三、做为一种数据拷贝、克隆机制。php
Serializable
ObjectOutputStream.writeObject(序列化对象)
ObjectInputStream .readObject()返回序列化对象
http://blog.csdn.net/scgaliguodong123_/article/details/45938555java
但在hadoop的序列化机制中,用户能够复用对象,这样就减小了java对象的分配和回收,提升了应用效率。python
Hadoop经过Writable
接口实现的序列化机制,不过没有提供比较功能,因此和java中的Comparable
接口合并,提供一个接口WritableComparable
。(自定义比较)算法
Writable
接口提供两个方法(write和readFields)。apache
xxxxxxxxxx
package org.apache.hadoop.io;public interface Writable {
void write(DataOutput out) throws IOException;
void readFields(DataInput in) throws IOException;
}
须要进行比较的话,要实现WritableComparable接口。编程
xxxxxxxxxx
public interface WritableComparable<T> extends Writable, Comparable<T>{}
http://blog.csdn.net/scgaliguodong123_/article/details/46010947api
WritableComparator 实现了 RawComparator<T> 继承了
extends Comparator<T>数组
xxxxxxxxxx
package org.apache.hadoop.io;public interface RawComparator<T> extends Comparator<T> {
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);
}public class WritableComparator implements RawComparator {
private final Class<? extends WritableComparable> keyClass; private final WritableComparable key1; private final WritableComparable key2;
}
xxxxxxxxxx
org.apache.hadoop.io 接口WritableComparable<T>
父接口
Comparable<T>, Writable 基础实现类
BooleanWritable, ByteWritable, ShortWritable,IntWritable,
VIntWritable,LongWritable, VLongWritable , FloatWritable, DoubleWritable高级实现类
MD5Hash, NullWritable,Text, BytesWritable,ObjectWritable,GenericWritable
仅实现了Writable接口的类服务器
org.apache.hadoop.io Interface(接口) WritableAll Known Subinterfaces(子接口):
Counter, CounterGroup, CounterGroupBase<T>, InputSplit, InputSplitWithLocationInfo, WritableComparable<T>
仅实现了Writable接口的类
数组:ArrayWritable、TwoDArrayWritable映射:AbstractMapWritable、MapWritable、SortedMapWritable
一、实现WritableComparable接口
二、实现相应的接口方法:
网络
A. write(dos) //将对象转换为字节流并写入到输出流out中。
B. readFileds() //从输入流in中读取字节流并发序列化为对象。
C. compareTo(o) //将this对象和对象o进行比较。
可参考下面的例子,自定义NewK2类:
http://blog.csdn.net/scgaliguodong123_/article/details/46010947
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
static
void
main(String[] args)
throws
IOException {
Student student =
new
Student(
"liguodong"
,
22
,
"男"
);
BufferedOutputStream bos =
new
BufferedOutputStream(
new
FileOutputStream(
new
File(
"g:/liguodong.txt"
)));
DataOutputStream dos =
new
DataOutputStream(bos);
student.write(dos);
dos.flush();
dos.close();
bos.close();
Student student2 =
new
Student();
BufferedInputStream bis =
new
BufferedInputStream(
new
FileInputStream(
new
File(
"g:/liguodong.txt"
)));
DataInputStream dis =
new
DataInputStream(bis);
student2.readFields(dis);
System.out.println(
"name="
+student2.getName()
+
",age="
+student2.getAge()+
",sex="
+student2.getSex());
// 打印:name=liguodong,age=22,sex=男
}
// 省略
//Hadoop序列化机制及实例 - 琴弦上、漫步 - CSDN博客
//http://blog.csdn.net/scgaliguodong123_/article/details/46385761#t3
|
一、紧凑:Hadoop中最稀缺的资源是宽带,因此紧凑的序列化机制能够充分的利用宽带。
二、快速:通讯时大量使用序列化机制,所以,须要减小序列化和反序列化的开销。
三、可扩展:随着通讯协议的升级而可升级。
四、互操做:支持不一样开发语言的通讯。
Hadoop1.x 序列化仅知足了紧凑和快速的特色。
序列化在分布式环境的两大做用:进程间通讯,永久存储。
Hadoop节点间通讯。
Apache Avro
一、丰富的数据结构类型
二、快速可压缩的二进制数据形式
三、存储持久数据的文件容器
四、远程过程调用RPC
五、简单的动态语言结合功能,Avro和动态语言结合后,读写数据文件和使用RPC协议都不须要生成代码,而代码生成做为一种可选的优化,只值得在静态类型语言中实现。
Facebook Thrift
一、是一种可伸缩的跨语言服务的发展软件框架。
二、它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工做效率和无缝地与C++,C#,.Java,Python和PHP和Ruby结合。
三、容许定义一个简单的定义文件中的数据类型和服务接口,以做为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通讯的无缝跨编程语言。
Google Protocolbuffer
PB是Google开源的一种轻量级的结构化数据存储格式,能够用于结构化数据的序
列化与反序列化,很适合作数据存储或RPC数据交换格式。
优势:
与 XML相比,它更小、更快、也更简单。你能够定义本身的数据结构,而后使用代码生成器生成的代码来读写这个数据结构。你甚至能够在无需从新部署程序的状况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,便可利用各类不一样语言或从各类不一样数据流中对你的结构化数据轻松读写。
它有一个很是棒的特性,即“向后”兼容性好,人们没必要破坏已部署的、依靠”老”数据格式的程序就能够对数据结构进行升级。这样您的程序就能够没必要担忧由于消息结构的改变而形成的大规模的代码重构或者迁移的问题。由于添加新的消息中的 field 并不会引发已经发布的程序的任何改变。
Protocolbuffer语义更清晰,无需相似 XML 解析器的东西(由于 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操做)。使用 Protobuf 无需学习复杂的文档对象模型,Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf 比其余的技术更加有吸引力。
不足:
Protbuf 与 XML 相比也有不足之处。它功能简单,没法用来表示复杂的概念。
因为文本并不适合用来描述数据结构,因此 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,因为 XML 具备某种程度上的自解释性,它能够被人直接读取编辑,在这一点上 Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,不然你无法直接读出 Protobuf 的任何内容。
Hadoop2.X用到的Protocolbuffer hadoop-2.6.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/proto
Hadoop序列化机制及实例 - 琴弦上、漫步 - CSDN博客
http://blog.csdn.net/scgaliguodong123_/article/details/46385761#t3
hadoop深刻研究:(十三)——序列化框架 - 独自登高楼 望断天涯路 - CSDN博客