AVRO 概述


要通过网络传输数据或其持久存储,你需要序列化 数据。在...之前 序列化 API 由 Java 和 Hadoop 提供,我们有一个特殊的实用程序,称为 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 在很大程度上依赖于它的 schema .它允许在没有架构先验知识的情况下写入每个数据。它可以快速序列化,并且生成的序列化数据的大小更小。 Schema 与 Avro 数据一起存储在一个文件中,以供进一步处理。

在 RPC 中,客户端和服务器在连接期间交换模式。这种交换有助于相同命名字段、缺失字段、额外字段等之间的通信。

Avro 模式是用 JSON 定义的,它通过 JSON 库简化了其在语言中的实现。

与 Avro 一样,Hadoop 中还有其他序列化机制,例如 序列文件、协议缓冲区、 and Thrift .

与 Thrift 和 Protocol Buffers 的比较


Thrift and 协议缓冲区 是 Avro 最有能力的库。 Avro 在以下方面与这些框架不同:

  • Avro 根据要求支持动态和静态类型。 Protocol Buffers 和 Thrift 使用接口定义语言 (IDL) 来指定模式及其类型。这些 IDL 用于生成用于序列化和反序列化的代码。

  • Avro 构建在 Hadoop 生态系统中。 Thrift 和 Protocol Buffers 不是构建在 Hadoop 生态系统中的。

与 Thrift 和 Protocol Buffer 不同,Avro 的模式定义是 JSON,而不是任何专有的 IDL。

Property Avro 节俭和协议缓冲区
动态模式 Yes No
内置于 Hadoop Yes No
JSON 中的模式 Yes No
无需编译 Yes No
无需申报身份证 Yes No
出血边缘 Yes No

Avro 的特点


下面列出了 Avro 的一些突出特点:

  • Avro 是一个 语言中立 数据序列化系统。

  • 它可以被多种语言处理(目前是 C、C++、C#、Java、Python 和 Ruby)。

  • Avro 创建的二进制结构化格式既是 可压缩的 and 可拆分的 .因此,它可以有效地用作 Hadoop MapReduce 作业的输入。

  • Avro 提供 丰富的数据结构 .例如,你可以创建包含数组、枚举类型和子记录的记录。这些数据类型可以用任何语言创建,可以在 Hadoop 中处理,并且可以将结果提供给第三种语言。

  • Avro schemas 定义在 JSON ,便于在已经有 JSON 库的语言中实现。

  • Avro 创建一个名为 Avro 数据文件, 它将数据及其模式存储在元数据部分中。

  • Avro 也用于远程过程调用 (RPC)。在 RPC 期间,客户端和服务器在连接握手中交换模式。

Avro 的一般工作


要使用 Avro,你需要遵循给定的工作流程:

  • 步骤 1 : 创建模式。在这里,你需要根据你的数据设计 Avro 架构。

  • 步骤 2 : 将模式读入你的程序。它通过两种方式完成:

    • 通过生成对应于 Schema 的类 : 使用 Avro 编译 schema。这会生成一个与架构对应的类文件

    • 通过使用解析器库 :可以直接使用parsers库读取schema。

  • 步骤 3 :使用为Avro提供的序列化API对数据进行序列化,在 包 org.apache.avro.specific .

  • 步骤 4 :使用Avro提供的反序列化API对数据进行反序列化,在 包 org.apache.avro.specific。