AVRO - 概述


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

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

什么是阿夫罗?

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 和 Protocol Buffer 的比较

ThriftProtocol Buffers是 Avro 最有能力的库。Avro 与这些框架的不同之处如下:

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

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

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

财产 阿夫罗 Thrift 和协议缓冲区
动态模式 是的
内置于 Hadoop 中 是的
JSON 中的架构 是的
无需编译 是的
无需申报ID 是的
最前沿 是的

阿夫罗的特点

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

  • Avro 是一个与语言无关的数据序列化系统。

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

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

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

  • JSON定义的Avro模式有助于在已有 JSON 库的语言中实现。

  • Avro 创建一个名为Avro 数据文件的自描述文件,其中将数据及其架构存储在元数据部分中。

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

Avro 的一般工作

要使用 Avro,您需要遵循给定的工作流程 -

  • 步骤 1 - 创建模式。这里你需要根据你的数据设计Avro schema。

  • 步骤 2 - 将模式读入您的程序中。它有两种方式完成 -

    • 通过生成对应于架构的类- 使用 Avro 编译架构。这会生成与模式对应的类文件

    • 通过使用解析器库- 您可以使用解析器库直接读取模式。

  • 步骤 3 - 使用为 Avro 提供的序列化 API 序列化数据,该 API 可以在包 org.apache.avro.specific中找到。

  • 步骤 4 - 使用为 Avro 提供的反序列化 API 反序列化数据,该 API 位于包 org.apache.avro.spec. 中。