各个序列化框架(Java序 列化、Avro 序列化、Kyro)

Java 序列化

Java  提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

java 通过实现 Serializable 接口实现序列化。

  • 只支持 Java 语言的序列化
  • 序列化和反序列化性能低
  • 序列化产出的数据很大(尤其在数据量大时体现比较明显)

Kyro

Kryo 是一个快速高效的 Java 二进制对象图序列化框架。该项目的目标是传输快、数据量小和易于使用的API。在任何需要持久化对象的时候,不管是文件、数据库还是网络,这个项目都很有用。

官文介绍,Kryo序列化机制比Java序列化机制性能提高10倍左右

Kryo 还可以执行自动的深度和深度复制/克隆。这是直接从对象复制到对象,而不是从对象复制到字节再复制到对象。

如何在 Spark 中使用 Kryo 序列化:Spark 中的 Kryo 磁盘序列化

Avro

Avro 是一个数据序列化系统,提供了

  • 丰富的数据结构
  • 一种紧凑、快速的二进制数据格式
  • 用于存储持久数据的容器文件。
  • 远程过程调用(RPC)。
  • 与动态语言的简单集成。读取或写入数据文件不需要代码生成,也不需要使用或实现RPC协议。代码生成作为一种可选的优化,只值得为静态类型语言实现。

Schemas

Avro 依赖于模式。当读取 Avro 数据时,写入数据时使用的模式始终存在。这使得每个数据的写入没有每个值的开销,使得序列化既快又小。这也促进了动态脚本语言的使用,因为数据及其模式是完全自描述的。

当 Avro 数据存储在一个文件中时,它的模式也随之存储,这样以后任何程序都可以处理这些文件。如果读取数据的程序需要不同的模式,那么可以很容易地解决这个问题,因为两个模式都存在。

在 RPC 中使用 Avro 时,客户机和服务器在连接握手中交换模式。(这可以进行优化,因此对于大多数调用,实际上不传输模式。)由于客户机和服务器都具有对方的完整模式,所以相同命名字段、缺少字段、额外字段等之间的通信都可以很容易地解决。

Avro 模式是用 JSON 定义的。这有助于在已经拥有 JSON 库的语言中实现。

与其他系统的比较

Avro 提供了与系统类似的功能,如 Thrift、Protocol Buffers 等。Avro 在以下几个基本方面与这些系统不同。

  • 动态类型:Avro 不需要生成这些代码。数据总是伴随着一个模式,该模式允许对数据进行完全处理,而不需要代码生成、静态数据类型等。这有助于构建通用的数据处理系统和语言。
  • 未标识数据:由于在读取数据时存在模式,因此需要用数据编码的类型信息要少得多,从而导致序列化的大小更小。
  • 没有手动分配的字段ID:当模式更改时,处理数据时总是同时存在旧模式和新模式,因此可以使用字段名象征性地解决差异。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章