Avro概述
为了通过网络传输数据或将其持久存储,您需要序列化数据。在Java和Hadoop提供的序列化API之前,我们有一个特殊的实用程序,称为Avro,这是一种基于模式的序列化技术。
本教程将教您如何使用Avro序列化和反序列化数据。Avro为各种编程语言提供库。在本教程中,我们将使用Java库演示示例。
什么是Avro?
Apache Avro是一个与语言无关的数据序列化系统。它由Hadoop之父Doug Cutting开发。由于Hadoop的可写类缺乏语言可移植性,Avro变得非常有用,因为它处理可以被多种语言处理的数据格式。Avro是Hadoop中序列化数据的首选工具。
Avro具有基于模式的系统。与它的读写操作关联的是一个与语言无关的模式。Avro序列化具有内置模式的数据。Avro将数据序列化为紧凑的二进制格式,任何应用程序都可以对其进行反序列化。
Avro使用JSON格式声明数据结构。目前,它支持Java、C、C++、C#、Python和Ruby等语言。
Avro模式
Avro严重依赖其模式。它允许在没有预先了解模式的情况下写入任何数据。它序列化速度快,生成的序列化数据大小较小。模式与Avro数据一起存储在一个文件中,以便进一步处理。
在RPC中,客户端和服务器在连接过程中交换模式。这种交换有助于相同名称的字段、缺失的字段、额外的字段等之间的通信。
Avro模式使用JSON定义,简化了在具有JSON库的语言中的实现。
与Avro类似,Hadoop中还有其他序列化机制,例如Sequence Files、Protocol Buffers和Thrift。
与Thrift和Protocol Buffers的比较
Thrift和Protocol Buffers是与Avro最具竞争力的库。Avro与这些框架的不同之处在于:
Avro根据需要支持动态类型和静态类型。Protocol Buffers和Thrift使用接口定义语言(IDL)来指定模式及其类型。这些IDL用于生成用于序列化和反序列化的代码。
Avro内置于Hadoop生态系统中。Thrift和Protocol Buffers并非内置于Hadoop生态系统中。
与Thrift和Protocol Buffer不同,Avro的模式定义使用JSON,而不是任何专有的IDL。
属性 | Avro | Thrift & Protocol Buffer |
---|---|---|
动态模式 | 是 | 否 |
内置于Hadoop | 是 | 否 |
JSON模式 | 是 | 否 |
无需编译 | 是 | 否 |
无需声明ID | 是 | 否 |
前沿技术 | 是 | 否 |
Avro的功能
以下是Avro的一些突出功能:
Avro是一个与语言无关的数据序列化系统。
它可以被多种语言处理(目前为C、C++、C#、Java、Python和Ruby)。
Avro创建二进制结构化格式,既可压缩又可分割。因此,它可以有效地用作Hadoop MapReduce作业的输入。
Avro提供丰富的数据结构。例如,您可以创建一个包含数组、枚举类型和子记录的记录。这些数据类型可以在任何语言中创建,可以在Hadoop中处理,结果可以馈送到第三种语言。
Avro模式使用JSON定义,方便在已具有JSON库的语言中实现。
Avro创建一个名为Avro数据文件的自描述文件,其中它将数据及其模式存储在元数据部分。
Avro也用于远程过程调用(RPC)。在RPC期间,客户端和服务器在连接握手过程中交换模式。
Avro的一般工作原理
要使用Avro,您需要遵循以下工作流程:
步骤1 - 创建模式。在这里,您需要根据您的数据设计Avro模式。
步骤2 - 将模式读入您的程序。这可以通过两种方式完成:
通过生成与模式对应的类 - 使用Avro编译模式。这将生成与模式对应的类文件
通过使用解析器库 - 您可以使用解析器库直接读取模式。
步骤3 - 使用Avro提供的序列化API进行数据序列化,该API位于org.apache.avro.specific包中。
步骤4 - 使用Avro提供的反序列化API进行数据反序列化,该API位于org.apache.avro.specific包中。