Fork me on GitHub

Avro-介绍

Apache Avro 是一个与语言无关的序列化工具,由Hadoop之父Doug Cutting开发。通过Avro读写数据文件无需生成代码,也不需要使用或实现RPC协议,使用JSON格式来自描述数据结构。支持Java、C、C++、C#、Python和Ruby等语言。

Avro Schema

  • Avro依赖于Schema,使得序列化速度很快,并且生成的序列化数据较小。当写入数据的时候,Schema结构与Avro数据一起存储在数据文件中以供进一步处理。

  • 在RPC中使用Avro,client和server连接时进行Schema交换,无论是client端还是server端都有完整的schema定义,这样使得命名相同的字段、缺失的字段、额外的字段等之间的对应关系可以进行同步及处理。

  • Avro模式使用Json定义,这有助于在已经有Json库的语言中实现。与Avro一样,Hadoop中还有其他序列化机制,例如Sequence Files、Protocol Buffers和Thrift.

  • Avro是一种可压缩和可拆分的二进制结构化格式,用来支持数据密集型应用,适合于远程或本地大规模数据的存储和交换,可以进行纯数据的发送和接收

1
2
3
4
5
6
7
8
9
10
11
// Schema样例
{
"type": "record",
"name": "Employee",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": "int"},
{"name": "emails", "type": {"type": "array", "items": "string"}},
{"name": "boss", "type": ["Employee","null"]}
]
}

Thrift & Protocol Buffers 对比 Avro

  • Avro同时支持动态和静态类型,而Protocol Buffers和Thrift使用接口定义语言(IDL)来指定数据结构及其类型,同时还需要使用定义好的数据机构和类型来序列化和反序列化代码。

  • Avro以Hadoop生态环境为基础,建立在Hadoop中,可以很好的与MapReduce Job进行结合;而Protocol Buffers和Thrift脱离Hadoop生态。

Avro使用步骤

  1. 创建Schema——根据数据格式要求创建符合Json规范的Schema文件

  2. 读取Schema文件——在程序中读取Schema文件,进行初始化(两种方式)

    • Avro编译模式,使用Avro-Tools生成带有Schema的实体类
    • Avro解析器模式,可以引入Avro的相关以来,通过代码解析的方式解析Schema文件
  3. 使用Avro提供的序列化API对数据进行序列化

  4. 使用Avro提供的反序列化API对数据进行反序列化


转载请注明出处:https://github.com/imperio-wxm


Thank you for your support.