文章目录
  1. 1. Binary Encoding
    1. 1.1. 基本数据类型
    2. 1.2. 复杂数据类型
      1. 1.2.1. 实例
  2. 2. JSON Encoding
    1. 2.1. 实例
  3. 3. 对象容器文件
  4. 4. 参考

Avro是一个序列化的系统,所以本章我们介绍Avro的序列化和反序列化。

对Avro数据序列化/反序列化时都需要对模式以深度优先(Depth-First),从左到右(Left-to-Right)的遍历顺序来执行。

Avro指定两种数据序列化编码方式:binary encoding 和Json encoding。使用二进制编码会高效序列化,并且序列化后得到的结果会比较小;而JSON一般用于调试系统或是基于WEB的应用。

Binary Encoding

基本数据类型

  1. null: Zero bytes
  2. boolean: a single byte whose value is either 0 (false) or 1 (true).
  3. int/long: variable-length zig-zag
  4. float: 4 bytes
  5. double: 8 bytes.
  6. bytes: encoded as a long followed by that many bytes of data
  7. string: encoded as a long followed by that many bytes of UTF-8 encoded character data

复杂数据类型

  1. Records: encoded just the concatenation of the encodings of its fields
  2. Enums: a int representing the zero-based position of the symbol in the schema
  3. Arrays: encoded as series of blocks. A block with count 0 indicates the end of the array. block:{long,items}
  4. Maps: encoded as series of blocks. A block with count 0 indicates the end of the map. block:{long,key/value pairs}.
  5. Unions: encoded by first writing a long value indicating the zero-based position within the union of the schema of its value. The value is then encoded per the indicated schema within the union.
  6. Fixed: encoded using number of bytes declared in the schema

实例

  1. String: “foo”

    06 66 6f 6f
    
  2. records

    {
        "type": "record", 
        "name": "test",
        "fields" : [
        {"name": "a", "type": "long"},
        {"name": "b", "type": "string"}
        ]
    }
    

    一个a=27,b=”foo”的实例:

    36 06 66 6f 6f 
    

JSON Encoding

Except for unions, the JSON encoding is the same as is used to encode field default values

实例

the union schema [“null”,”string”,”Foo”]。

  1. null 编码为 null
  2. string “a” 编码为{“string”: “a”}
  3. Foo的实例编码为{“Foo”:{….}}

对象容器文件

Avro为了便于MapReduce的处理定义了一种容器文件格式(Container File Format)。这样的文件中只能有一种模式,所有需要存入这个文件的对象都需要按照这种模式以二进制编码的形式写入。对象在文件中以块(Block)来组织,并且这些对象都是可以被压缩的。块和块之间会存在同步标记符(Synchronization Marker),以便MapReduce方便地切割文件用于处理。下图是根据文档描述画出的文件结构图:

一个存储文件由两部分组成:头信息(Header)和数据块(Data Block)。

头信息又由三部分构成:四个字节的前缀(类似于Magic Number),文件Meta-data信息和随机生成的16字节同步标记符。

Avro目前支持的Meta-data有两种:schema和codec。codec表示对后面的文件数据块(File Data Block)采用何种压缩方式。Avro的实现都需要支持下面两种压缩方式:null(不压缩)和deflate(使用Deflate算法压缩数据块)。除了文档中认定的两种Meta-data,用户还可以自定义适用于自己的Meta-data。这里用long型来表示有多少个Meta-data数据对,也是让用户在实际应用中可以定义足够的Meta-data信息。对于每对Meta-data信息,都有一个string型的key(需要以“avro.” 为前缀)和二进制编码后的value。

对于文件中头信息之后的每个数据块,有这样的结构:一个long值记录当前块有多少个对象,一个long值用于记录当前块经过压缩后的字节数,真正的序列化对象和16字节长度的同步标记符。由于对象可以组织成不同的块,使用时就可以不经过反序列化而对某个数据块进行操作。还可以由数据块数,对象数和同步标记符来定位损坏的块以确保数据完整性。

参考

  1. Apache Avro™ 1.7.7 Specification
文章目录
  1. 1. Binary Encoding
    1. 1.1. 基本数据类型
    2. 1.2. 复杂数据类型
      1. 1.2.1. 实例
  2. 2. JSON Encoding
    1. 2.1. 实例
  3. 3. 对象容器文件
  4. 4. 参考