Apache Avro

一、概述

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

你可能感兴趣的:(Open,Source)