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 包中。