一、到底在哪些地方需要使用序列化技术呢?
1、当在网络中需要进行消息、数据、等的传输,那么这些数据就需要进行序列化和反序列化。
2、当数据需要从内存被持久化到磁盘的时候。
二、Zookeeper(分布式协调服务组件+存储系统)
任何一个分布式系统的底层,都必然会有网络通信,这就必然要提供一个分布式通信框架和序列化机制。
Zookeeper网络通信和序列化。你知道有哪些序列化方式呢?
1、Java提供的序列化机制
2、Hadoop的序列化技术
3、Zookeeper的序列化
4、Spark提供的序列化等等
1、Java序列化机制
2、Hadoop序列化机制
有两种方式:avro(implements Writable) protobuf
Hdfs中使用的序列化就是avro,Yarn使用的是Protobuf
Hadoop的序列化和反序列化中的字段的顺序和多少,一定要严格一样,否则序列化和反序列化就对不上了。
class Student implements Writable{
// 反序列化
void readFields(DataIn input);
// 序列化
void write(DataOut output);
}
3、Zookeeper序列化机制
zk中的序列化和反序列化,没有严格的顺序要求,因为使用tag标记,下面会有简单的demo示例:
class Student implements Record{
// 反序列化
void deserialize(InputArchive archive, String tag) {
archive.readBytes();
archive.readInt();
}
// 序列化
void serialize(OutputArchive archive, String tag)
}
ZK中序列化就是Record,如果在源码中看到了一个类实现了Record接口,那么这个类必然将有数据从磁盘读取到内存和从内存序列化到磁盘的方法。
序列化的API主要在zookeeper-jute子项目中。
重点API:
org.apache.jute.InputArchive:反序列化需要实现的接口,其中各种read开头的方法,都是反序列化方法
实现类:在3.4.x之前有三种实现,见图:
3.5之后的版本 就只有Binary这一种了,主要原因是CSV和XML这两种实现类没有人使用,如果需需呀使用这两种实现,直接从老版本中复制。
org.apache.jute.OutputArchive:所有进行序列化操作的都是实现这个接口,其中各种write开头的方法都是序列化方法。
org.apache.jute.Index:用于迭代数据进行反序列化的迭代器。见图:
org.apache.jute.Record:在Zookeeper要进行网络通信的对象,都需要实现这个接口。里面有序列化和反序列化两个重要的方法。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章