Avro 简明教程

AVRO - Overview

为通过网络传输数据或进行持久化存储,您需要序列化数据。在 Java 和 Hadoop 提供的 serialization APIs 之前,我们有一个特殊的实用程序,称为 Avro ,一种基于模式的序列化技术。

本教程教您如何使用 Avro 序列化和反序列化数据。Avro 为各种编程语言提供库。在本教程中,我们使用 Java 库演示了示例。

What is Avro?

Apache Avro 是一个与语言无关的数据序列化系统。它由 Hadoop 之父 Doug Cutting 开发。由于 Hadoop 可写类缺乏语言可移植性,因此 Avro 非常有用,因为它处理的数据格式可以由多重语言处理。Avro 是一个序列化 Hadoop 数据的首选工具。

Avro 有一个基于模式的系统。与语言无关的模式与其读写操作相关联。Avro 序列化具有内置模式的数据。Avro 将数据序列化成紧凑的二进制格式,它可以被任何应用程序反序列化。

Avro 使用 JSON 格式来声明数据结构。目前,它支持 Java、C、C++、C#、Python 和 Ruby 等语言。

Avro Schemas

Avro 高度依赖其 schema 。它允许每个数据在完全不知道模式的情况下编写。它快速序列化,得到的序列化数据更小。模式连同 Avro 数据一起存储在一个文件中以进行任何进一步处理。

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

Avro 模式用 JSON 定义,这简化了它在具有 JSON 库的语言中的实现。

与 Avro 一样,Hadoop 中还有其他序列化机制,例如 Sequence Files, Protocol Buffers,Thrift

Comparison with Thrift and Protocol Buffers

ThriftProtocol Buffers 是 Avro 最好的库。Avro 和这些框架在以下方面有所不同 −

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

  2. Avro 是在 Hadoop 生态系统中构建的。Thrift 和 Protocol Buffers 并不是在 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

无需声明 ID

Yes

No

Bleeding edge

Yes

No

Features of Avro

下面列出 Avro 的一些突出特性 −

  1. Avro 是一个 language-neutral 数据序列化系统。

  2. 它可以用多种语言进行处理(目前可以处理 C、C++、C#、Java、Python 和 Ruby)。

  3. Avro 创建二进制结构化格式,既 compressiblesplittable 。因此,可以将它有效地用作 Hadoop MapReduce 作业的输入。

  4. Avro 提供 rich data structures 。例如,你可以创建一个包含数组、枚举类型和子记录的记录。这些数据类型可以在任何语言中创建,可以在 Hadoop 中处理,结果可以提供给第三语言。

  5. schemasJSON 中定义的 Avro,有助于在已拥有 JSON 库的语言中实现。

  6. Avro 创建一个自描述文件,名为 Avro 数据文件,其中它连同其模式一起在元数据部分存储数据。

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

General Working of Avro

要使用 Avro,你需要执行以下工作流 −

  1. Step 1 − 创建模式。此处你需要根据你的数据设计 Avro 模式。

  2. Step 2 − 将模式读入程序。这可通过两种方法完成 − By Generating a Class Corresponding to Schema − 使用 Avro 编译模式。这将生成一个与模式对应的类文件 By Using Parsers Library − 你可以直接使用解析器库来读取模式。

  3. Step 3 − 使用为 Avro 提供的序列化 API 来序列化数据,该 API 在 package org.apache.avro.specific 中。

  4. Step 4 − 使用为 Avro 提供的反序列化 API 来反序列化数据,该 API 在 package org.apache.avro.specific. 中。