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 中还有其他序列化机制,例如 序列文件、协议缓冲区 和 Thrift。
与 Thrift 和协议缓冲区的比较
Thrift 和 协议缓冲区 是 Avro 最强大的库。Avro 与这些框架在以下方面有所不同 −
Avro 根据要求支持动态和静态类型。协议缓冲区和 Thrift 使用接口定义语言 (IDL) 来指定模式及其类型。这些 IDL 用于生成序列化和反序列化的代码。
Avro 建立在 Hadoop 生态系统中。Thrift 和 Protocol Buffers 不是建立在 Hadoop 生态系统中。
与 Thrift 和 Protocol Buffer 不同,Avro 的模式定义采用 JSON 格式,而不是任何专有 IDL 格式。
属性 | Avro | Thrift &协议缓冲区 |
---|---|---|
动态模式 | 是 | 否 |
内置于 Hadoop | 是 | 否 |
JSON 模式 | 是 | 否 |
无需编译 | 是 | 否 |
否需要声明 ID | 是 | 否 |
前沿 | 是 | 否 |
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 包中。