源码项目zookeeper-3.6.3:基础
那些场景需要使用序列化技术
1、网络中需要进行消息,数据等传输,这些数据需要序列化和反序列化
2、数据需要被持久化到磁盘时
ZooKeeper(分布式协调服务组件+存储系统)
任何一个分布式系统的底层,都必然会有网络通信,这必然要提供一个分布式通信框架和序列化机制。
序列化技术:
1、Java提供的序列化技术
2、Hadoop的序列化技术,类似(Writable+Protobuf)的自定义序列化机制
类似实现:ZooKeeper的序列化
3、protobuf
yarn hbase等都用的protobuf做序列化
NIO+Protobuf 构成网络通信
Java序列化机制
1、class Student implents Serializable
2、序列化过程:类型信息+对象实例的属性
3、特点:笨重,除了实例的属性信息以外,还会序列化这个实例的类型信息
4、Spark默认使用的序列化机制就是Java原生序列化机制,也提供其他序列化方式
5、使用ObjectInputStream和ObjectOutputStream来进行具体的序列化和反序列化
Hadoop序列化机制
两种方式:avro(implements Writable) + protobuf
//Hadoop的序列化 和 反序列化的字段顺序和多少一定要严格一样。否则 序列化和反序列化对不上了
class Student implements Writable {
int id;
String name;
//反序列化
void readFields(DataIn input){
this.id = input.readInt();
this.name = input.readUTF();
}
//序列化
void write(DataOut output){
output.writeInt(id);
output.writeUTF(name);
}
}
//ZK内部有一个数据库:ZKDataBase
//冷启动的时候,ZKDataBase需要从磁盘读取DataNode对象恢复到内存中
//ZKDataBase存储了DataTree,DataTree由成千上万的DataNode组成,保存的其他信息,通过标记区分
//类似格式:Hadoop SequenceFile(序列化格式:key=value)
zookeeper-jute序列化项目
jute项目的类比较少,compiler不用看,需要理清类中继承结构,重要的是规范,是抽象,所以主要看接口。有四个接口:
序列化需要OutputArchive参数,反序列化需要InputArchive参数,他们俩也是两个接口:
通过OutputArchive写出,其中定义好了,基本类型(writeByte、writeBool、writeInt、writeLong、writeFloat、writeDouble、writeString)、writeRecord用来对象中有成员变量(自定义类)等
主要是InputArchive、OutputArchive的子类实现,均有三种子类实现:XML(特定,3.5版本后舍弃)、CSV(特定,3.5版本后舍弃)、Binary(通用实现)
BinaryInputArchive、BinaryOutputArchive是3.5版本后实现具体序列化的唯一实现类。
序列化机制中提供InputArchive、OutputArchive、Record三种就够了。
RecordWriter、RecordReader、Utils是工具类。
Index接口就是一个Iterator迭代器:done()等同于hasNext(),incr()等同于next(),针对从磁盘文件读一大堆对象时,读一个对象反序列化一个
重点API:
org.apache.jute.InputArchive:3.4.14之前有三种实现,之后只有Binary实现
反序列化需要实现的接口,其中各种 read 开头的方法,都是反序列化方法
org.apache.jute.OutputArchive:所有进行序列化操作的都是实现这个接口,其中各种 write 开头的方法都是序列化方法
org.apache.jute.Index:用于迭代数据进行反序列化的迭代器
org.apache.jute.Record:在 ZooKeeper 要进行网络通信的对象,都需要实现这个接口。里面有序列化和反序列化两个重要的方法
备注:性能上没有protobuf好,有相关知识储备可以用protobuf实现,当然仍有很多组件用jute