一、概述
Apache Avro是一种数据序列化的系统,它提供了:
1) 支持多种数据结构
2) 二进制文件格式(压缩率高&传输速度快)
3) 容器文件格式(以便于存放持久化数据)
4) RPC
5) 集成了多种动态语言
二、Schema
Avro依赖schema定义数据格式,从而可以自描述和动态加载。schema为json格式。
.avsc schema文件,例如:
{"type": "record", "name": "test.Weather",
"doc": "A weather reading.",
"fields": [
{"name": "station", "type": "string", "order": "ignore"},
{"name": "time", "type": "long"},
{"name": "temp", "type": "int"}
]
}
.avro 数据文件,例如:
Objavro.codecnullavro.schema�{"type":"record","name":"Weather","namespace":"test","fields":[{"name":"station","type":"string"},{"name":"time","type":"long"},{"name":"temp","type":"int"}],"doc":"A weather reading."}
三、与
Thrift、Protocol Buffers等的区别
1) 动态类型支持,也就是数据和schema在一起,可以自描述
2) 由于包含了schema,不再需要额外的tag来分隔字段等,使得序列化后的大小更小
3) schema更新后,可以通过比较field name来得到差异点,且不会影响旧版本的data
四、数据类型
基本类型:null、boolean、int、long、float、double、bytes和string
复合类型:records、enums、arrays、maps、unions和fixed
示例:
{
"type": "record",
"name": "LongList",
"aliases": ["LinkedLongs"], // old name for this
"fields" : [
{"name": "value", "type": "long"}, // each element has a long
{"name": "next", "type": ["LongList", "null"]} // optional next element
]
}
{
"type": "enum",
"name": "Suit",
"symbols" : ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]
}
{"type": "array", "items": "string"}
{"type": "map", "values": "long"}
["string", "null"] // union
{"type": "fixed", "size": 16, "name": "md5"}
四、序列化
支持二进制和JSON两种。二进制更小,适合传输;JSON可能会适合debug和web应用。
五、排序
schema支持排序,且二进制序列化的数据可以不反序列化就进行排序。16-byte Sync Marker
六、参考
http://www.slideshare.net/cloudera/apachecon09-doug-cutting-on-avro