Avro 简介
ApacheAvro(http:llavro.apache.org)是一个独立于编程语言的数据序列化系统。该项目是由Doug Cutting(Hadoop之父)创建的,旨在解决Hadoop中Writable类型的不足:缺乏语言的可移植性。拥有一个可被多种语言(当前是C, C++, Java,Python和Ruby)处理的数据格式与绑定到单一语言的数据格式相比,前者更易于与公众共享数据集。允许其他编程语言能够读写数据,该类数据格式进行读写操作,会使其具有更好的特性。
Avro规范((http: //avro. apache. org/dots/current/spec. html)精确定义所有实现都必须支持的二进制格式。同时它还指定这些实现还需要支持其他Avro特性。但是,该规范并没有给API制定规范:实现可以根据自己的需求操作Avro数据并给出相应的API,因为每个API都与语言相关。事实上,只有一种二进制格式比较重要,这表明绑定一种新的编程语言来实现是比较容易的,可以避免语言和格式组合爆炸问题,·否则将对互操作性造成一定的问题。Avro有丰富的数据模式解析(data
schema resolution)能力。在精心定义的约束条件下,读数据所用的模式不必与写数据所用的模式相同。由此,Avro是支持模式演化的。例如,通过在用于读取以前数据的模式中声明新的用于读取记录的选项字段。新的和以前客户端均能以相似的方法读取按旧模式存储的数据,同时新的客户端可以使用新的字段写入的新内容。相反的,如果老客户端读取新客户端写入的数据,它将忽略新加入的字段并按照先前的数据模式进行处理。Avro为一系列对象指定一个对象容器格式—类似于Hadoop的顺序文件。Avro数据文件包含元数据项,模式数据存储在其中,这使文件可以自我声明。Avro数据文件支持压缩,并且是可切分的,这对MapReduc。的输入格式至关重要。另外,Avro本身是为MapReduce设计的,所以在不久的将来有可能使用Avro作为一流的MapReduce
API(即,比Streaming更丰富的API,就像Java API或C++管道一样)融入其他编程语言。
Avro数据类型和模式
Avro 定义了少数数据类型,它们可用于以写模式的方式来构建应用特定的数据结考虑到互操作性,其实现必须支持所有的Avro类型。
每个基本类型还可以使用更冗长的形式和使用type属性来指定,示例如下:{"type":"null"}
avro基本类型
类型名称 |
描述 |
模式示例 |
null |
空值 |
"null" |
Boolean |
二进制值 |
"boolean" |
int |
32位带符号整数 |
“int" |
long |
64位带符号整数 |
"long" |
于load |
单精度(32位)IEEE754浮点数 |
“于loat" |
double |
双精度(64位)IEEE754浮点数 |
"double" |
bytes |
8位无符号字节序列 |
“bytes" |
string |
Unicode字符序列 |
“string" |
Avro的复杂类型
类型名称 |
描述 |
模式实例 |
array |
一个排过序的对象集合。特定数组中的所有对象必须模式相同 |
{"array":"long"} |
map |
未排过序的键/值对。键必须是字符串,值可以是任何类型,但一个特定map中所有值必须模式相同 |
{"type":"map", |
record |
任意类型的一个命名字段集合 |
{ |
enum |
一个命名的值集合 |
{ |
fixed |
一组固定数量的8位无符号字节 |
{"type":"fixed", |
union |
模式的并集。并集可以用json数组表示,其中每个元素为一个模式口并集表示的数据必须与其其中一个模式相匹配 |
[ |
Java拥有第三类映射,即自反映射(reflectmapping,将avro类型映射成事先已有的Java类)。它的速度比通用映射和特殊映射都慢,所以不推荐在新应用中使用。
Avro的java映射类型
avro类型 |
Java通用映射 |
Java特殊映射 |
Java自反映射 |
null |
null类型 |
|
|
boolear |
Boolean |
|
|
int |
Int |
|
short或int |
long |
long |
|
|
float |
float |
|
|
double |
double |
|
|
bytes |
java.nio.bytebuffer |
|
字节数组 |
string |
org.apache. |
|
|
array |
org.apache. |
|
array或Java.util/Collection |
map |
java.util/map |
|
java.lang.String |
record |
org.apache.avro. |
生成实现org.apache.avro. |
具有零参数构造函数的任意用户类。 |
enum |
java.lang.string |
生成java enum类型 |
任意java enum类型 |
fixed |
org.apache.avro. |
生成实现org.apache.avro. |
org.apache.avro |
union |
Java.lang.object |
|
|