📜  AVRO-概述(1)

📅  最后修改于: 2023-12-03 15:13:33.975000             🧑  作者: Mango

AVRO-概述

简介

Avro 是一个数据序列化系统,用于高效地在大型系统之间交换结构化数据。它旨在提供简单的快速的、易于使用的数据序列化系统,同时对语言无关,兼容性强。

它支持多种编程语言,并可集成到 Hadoop、Flink、Spark 等分布式计算系统中。

特点
  • 跨语言支持:Avro 支持多种语言,例如 Java、Python、C、C++、C# 等。
  • Schema 作为本地文件提供:Avro 将 Schema 存储为本地文件,以便 Avro 的各个组件都可以使用相同的 Schema。
  • 压缩:由于 Avro 通常用于大规模数据,因此它包括一个可插入式的压缩器框架,可以在序列化后压缩数据以节省宽带。
  • 速度:Avro 旨在成为最快的序列化系统之一,具有高速编码和解码的特性。
Schema

在 Avro 中,所有数据类型都由 Schema 表示。Schema 是一种基于 JSON 表示法的数据描述。它描述了一个数据对象的名称、存储在对象中的字段以及字段中使用的数据类型。通过 Avro 的 Schema 方式,可以轻松地在 Avro 的各个组件中传输和使用数据对象。

以下是一个 Avro Schema 的示例:

{
  "type": "record",
  "name": "Person",
  "fields": [
    { "name": "firstName", "type": "string" },
    { "name": "lastName", "type": "string" },
    { "name": "age", "type": "int" }
  ]
}

上述 Schema 定义了一个名为 Person 的记录类型,它有三个字段:firstName、lastName 和 age。firstName 和 lastName 的类型是字符串,而 age 的类型是整数。

序列化和反序列化

Avro 的 Java 库提供了一组简单的 API,可用于将 Java 对象序列化为 Avro 数据并将 Avro 数据反序列化为 Java 对象。

以下是一个使用 Avro 库序列化和反序列化 Java 对象的示例:

// 创建含有数据的 Java 对象
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
person.setAge(30);

// 将 Java 对象序列化为 Avro 数据
ByteArrayOutputStream out = new ByteArrayOutputStream();
DatumWriter<Person> writer = new SpecificDatumWriter<>(person.getSchema());
Encoder encoder = EncoderFactory.get().binaryEncoder(out, null);
writer.write(person, encoder);
encoder.flush();
out.close();
byte[] bytes = out.toByteArray();

// 将 Avro 数据反序列化为 Java 对象
DatumReader<Person> reader = new SpecificDatumReader<>(Person.class);
Decoder decoder = DecoderFactory.get().binaryDecoder(bytes, null);
Person deserializedPerson = reader.read(null, decoder);
支持的序列化格式

Avro 提供了多种序列化格式,包括二进制、JSON 和压缩格式。其中,二进制序列化格式是默认的序列化格式,也是最快的格式。而 JSON 序列化格式则更易于人类阅读和编写。压缩格式能够压缩序列化数据,从而减少网络传输和磁盘占用。

总结

Avro 是一个跨语言、易于使用、高效的数据序列化系统,适用于大型系统中的结构化数据传输和存储。它支持多种编程语言,可以集成到常见的分布式计算系统中。Avro 的 Schema 表示方式描述了数据类型,使得在 Avro 的各个组件中传输和使用数据更加方便。Avro 的 Java 库提供了序列化和反序列化 Java 对象的 API,而 Avro 提供了多种序列化格式,包括二进制、JSON 和压缩格式。