这是一篇翻译自 http://hadoop.apache.org/avro/docs/current/index.html 的介绍 Avro 的文章。翻译经验不多,有不妥之处还望多多指正。
介绍
Avro 是一个数据序列化系统。
Avro 提供了:
- 丰富的数据结构。
- 一个简约的、快速的、二进制数据格式。
- 一个容器文件,用于存储持久数据。
- 远程过程调用(RPC)。
- 和其他动态语言的简单集成。存取数据文件或者使用 RPC 协议的时候不需要生成代码。代码生成只是作为静态类型语言的一个可选的优化项。
模式
Avro 依赖于模式。当 Avro 数据被读取时,可以获得写数据时使用到的模式。这就不必为写入的每一个数据花费额外的开销,使序列化变得小而快。由于数据和它的模式都是自描述的,促进了动态、脚本语言的使用。
Avro 数据和模式一起被存在文件中,因此数据文件可以在随后被任何程序处理。当一个读取数据的程序希望一个不同的模式,可以同时使用两种模式来解决。
当 Avro 被使用在 RPC 中时,客户端和服务器端在连接的握手阶段就交换模式。(这样对于大多数的调用,不需要再传送模式。)由于客户端和服务器端都拥有对方的全部模式,可以很容易的解决相同名字域、缺失域、额外域之间的对应。
Avro 的模式由 JSON 定义,这可以促进那些拥有 JSON 库的语言更容易使用 Avro。
和其他系统的比较
Avro 提供的功能和其他的一些系统比如 Thrift, Protocol Buffers 类似。和其他系统不同的地方在于:
1. 动态类型。Avro 不需要生成代码,这有利于搭建通用的数据处理系统以及语言。
2. 未加标签的数据。因为模式能在读取数据的时候读取,很自然的,在对数据进行编码的时候只需要保留更少的类型信息,这有利于减少序列化后的数据大小。
3. 没有手工分配的域标识。当一个模式发生改变时,在处理数据的时候可以同时看到新旧两种模式,使用符号化表示的域名就可以解决这种差异。