📅  最后修改于: 2020-12-02 05:23:44             🧑  作者: Mango
要通过网络或其持久性存储传输数据,您需要对数据进行序列化。在Java和Hadoop提供的序列化API之前,我们有一个特殊的实用程序,称为Avro ,这是一种基于模式的序列化技术。
本教程教您如何使用Avro序列化和反序列化数据。 Avro提供了用于各种编程语言的库。在本教程中,我们将演示使用Java库的示例。
Apache Avro是与语言无关的数据序列化系统。它由Hadoop的父亲Doug Cutting开发。由于Hadoop可写类缺乏语言可移植性,Avro变得很有帮助,因为它处理可由多种语言处理的数据格式。 Avro是在Hadoop中序列化数据的首选工具。
Avro具有基于架构的系统。语言无关的架构与其读取和写入操作相关联。 Avro序列化具有内置模式的数据。 Avro将数据序列化为紧凑的二进制格式,任何应用程序都可以将其反序列化。
Avro使用JSON格式声明数据结构。目前,它支持Java,C,C++,C#, Python和Ruby等语言。
Avro在很大程度上取决于其架构。它允许在不事先了解架构的情况下写入每个数据。它可以快速序列化,并且生成的序列化数据的大小较小。模式与Avro数据一起存储在文件中,以进行进一步处理。
在RPC中,客户端和服务器在连接期间交换架构。这种交换有助于相同命名字段,缺少字段,多余字段等之间的通信。
Avro模式是使用JSON定义的,从而简化了使用JSON库在语言中的实现。
像Avro一样,Hadoop中还有其他序列化机制,例如序列文件,协议缓冲区和Thrift 。
节俭和协议缓冲区是Avro最有能力的库。 Avro在以下方面与这些框架不同-
Avro根据要求支持动态和静态类型。协议缓冲区和节流协议使用接口定义语言(IDL)来指定架构及其类型。这些IDL用于生成用于序列化和反序列化的代码。
Avro构建在Hadoop生态系统中。节俭和协议缓冲区不是在Hadoop生态系统中构建的。
与Thrift和Protocol Buffer不同,Avro的模式定义使用JSON而不是任何专有IDL。
Property | Avro | Thrift & Protocol Buffer |
---|---|---|
Dynamic schema | Yes | No |
Built into Hadoop | Yes | No |
Schema in JSON | Yes | No |
No need to compile | Yes | No |
No need to declare IDs | Yes | No |
Bleeding edge | Yes | No |
以下列出的是Avro的一些突出特点-
Avro是与语言无关的数据序列化系统。
它可以由多种语言(当前为C,C++,C#,Java, Python和Ruby)处理。
Avro创建可压缩和可拆分的二进制结构化格式。因此,它可以有效地用作Hadoop MapReduce作业的输入。
Avro提供了丰富的数据结构。例如,您可以创建一个包含数组,枚举类型和子记录的记录。可以使用任何语言创建这些数据类型,可以在Hadoop中对其进行处理,并将结果提供给第三种语言。
JSON中定义的Avro模式有助于以已经具有JSON库的语言进行实施。
Avro创建一个名为Avro数据文件的自描述文件,在其中将数据及其架构存储在元数据部分中。
Avro还用于远程过程调用(RPC)。在RPC期间,客户端和服务器在连接握手中交换模式。
要使用Avro,您需要遵循给定的工作流程-
步骤1-创建架构。在这里,您需要根据数据设计Avro模式。
步骤2-将模式读入程序。它以两种方式完成-
通过生成对应于架构的类-使用Avro编译架构。这将生成与模式相对应的类文件
通过使用解析器库-您可以使用解析器库直接读取架构。
步骤3-使用为Avro提供的序列化API序列化数据,可以在org.apache.avro.specific包中找到。
步骤4-使用为Avro提供的反序列化API反序列化数据,该API可在org.apache.avro.specific包中找到。