AVRO – 概述
AVRO – 概述
要通过网络传输数据或其持久存储,您需要序列化数据。在Java 和 Hadoop 提供的序列化 API之前,我们有一个特殊的实用程序,称为Avro,这是一种基于模式的序列化技术。
本教程教您如何使用 Avro 序列化和反序列化数据。Avro 为各种编程语言提供了库。在本教程中,我们将演示使用 Java 库的示例。
什么是阿夫罗?
Apache Avro 是一种语言中立的数据序列化系统。它是由 Hadoop 之父 Doug Cut 开发的。由于 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 中。
Property | 阿夫罗 | 节俭和协议缓冲区 |
---|---|---|
Dynamic schema | 是的 | 不 |
Built into Hadoop | 是的 | 不 |
Schema in JSON | 是的 | 不 |
No need to compile | 是的 | 不 |
No need to declare IDs | 是的 | 不 |
Bleeding edge | 是的 | 不 |
Avro 的特点
下面列出了 Avro 的一些突出特点 –
-
Avro 是一种语言中立的数据序列化系统。
-
它可以被多种语言处理(目前是 C、C++、C#、Java、Python 和 Ruby)。
-
Avro公司创建二进制结构化的格式,既压缩和裂开的。因此,它可以有效地用作 Hadoop MapReduce 作业的输入。
-
Avro 提供了丰富的数据结构。例如,您可以创建一个包含数组、枚举类型和子记录的记录。这些数据类型可以用任何语言创建,可以在 Hadoop 中处理,结果可以提供给第三种语言。
-
在JSON 中定义的Avro模式有助于在已有 JSON 库的语言中实现。
-
Avro 创建了一个名为Avro Data File的自描述文件,它在元数据部分中存储数据及其架构。
-
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 包中。