Apache Avro:一个新的数据交换格式

原文: http://blog.cloudera.com/blog/2009/11/avro-a-new-format-for-data-interchange/编程

注:因为我的英语能力有限,翻译不许确,请指出。英语好,若有意愿一块儿翻译一些博客,请加qq 583368684数组

Apache Avro 最近加入了Hadoop项目的你们庭。Avro定义了一个数据格式,从设计上支持数据密集型应用,而且为多编程语言提供该格式支持。服务器

背景

咱们但愿数据驱动的应用是动态。人们应该可以快速组合来自不一样数据源的数据集。咱们但愿促进数据的新颖和创新探索。理想状况下,不须要大量的准备工做,人们应该可以容易地将销售点交易。网站访问和外部提供的人口统计数据相关联。这是可能的,使用脚本或者交互式工具。数据结构

当前的数据格式每每不是很好用。XML 和 JSON都有很强的表达性,可是他们太大了而且处理比较慢。当处理PB级别的数据,大小和速度很重要。框架

谷歌用Protocol Buffers 来解决(也有一些相似的系统,如Thrift)。谷歌已经将Protocol Buffers 开源,可是它不是咱们理想的解决方案。编程语言

通用数据

使用Protocol Buffers,能够定义数据结构,而后生成能够有效读取和写入他们的代码。可是,若是但愿脚本语言用Protocol Buffers快速实现一个实验,首先必须:获取数据结构定义;而后生成对应的代码;最后获得数据前要获取代码。这可能不是那么糟糕,可是若是但愿要一个通用的工具,可以留言全部的数据集合,它将不得不获取每一个数据集的数据结构定义,而后生成代码和获取代码为每一个数据集。这把原本应该简单的事情变复杂了。分布式

Avro的数据格式老是以易于处理的形式存储数据结构与数据。Avro能够在运行时使用这些定义以通用的方式向应用程序呈现数据,而不是须要代码生成。工具

代码生成在Avro中是可选的。它在一些编程语言有时使用特定的数据结构,对应于常常序列化的数据类型是很是好用的。可是在像Pig和Hive这样的脚本系统中,代码生成将是一种负担,因此Avro不须要它。oop

存储所有的数据结构定义和数据的另一个优点是容许数据被更快更简洁的写入。Protocol Buffere 为数据添加注解,所以即便定义和数据不彻底匹配,数据仍有可能被处理。然而这些注释使得数据更大和更慢的被处理。Avro不须要这些注释,使得Avro数据比其余序列化系统更小和更快地处理。网站

Avro Schemas

Avro 用JSON来定义数据结构的schema.例如一个二位点能够被定义为Avro record:

{
    "type": "record", "name": "Point",
     "fields":
     [
          {"name": "x", "type": "int"},
          {"name": "y", "type": "int"},
     ]
}

每一个实例被序列化为两个整数,没有额外的记录和注释。整数使用可变长度的zig-zag 编码写入。所以,小的负数和整数可以被写仅仅须要两个字节,100个点仅仅须要200个字节。

除了Record和数字类型,Avro还支持数组、map、枚举、可变和固定长度的二进制字节数据和字符串。它还能定义一个容器文件格式,为了可以为MapReduce和其余计算框架提供支持。详细内容,请查看Avro文档。

兼容性

应用的发展,随着他们的发展,数据结构可能发生变化。咱们但愿新版本的应用程序仍然可以处理旧版本建立的数据,反之亦然。Avro与Protocol Buffers 相同的方式处理这个问题。当应用程序不须要不存在的字段时,Avro提供一个指定的默认值,Avro忽略不须要但存在的数据。这不能处理全部的向后兼容问题。但它能很是容易的处理最多见的问题。

Avro也定义远程过程调用协议(RPC).虽然在RPC中使用的数据类型和数据集中的数据类型不一样,可是使用通用序列化系统仍然有用。数据密集型应用程序须要基于分布式RPC框架。因此我须要可以处理数据集文件,也但愿可以用RPC。所以在公共基础上构建这些,使得可以编写处理数据的代码,但不能使用分布式框架来作的概率大大下降。

和Hadoop的集成

咱们但愿在Hadoop的MapReduce中容易使用Avro数据。这仍然是一个正在进行中的工做。问题MAPREDUCE-1126和MAPREDUCE-815跟踪这个

注意,Avro数据结构能够指定他们的排序顺序,所以能够在一中编程语言中建立复杂的数据,而后能够用另一中语言排序。没有反序列化的排序也是有可能的,所以至关快。

咱们但愿Avro将取代Hadoop现有的RPC.Hadoop目前须要其客户端和服务器运行彻底相同的版本。咱们但愿Avro容许一个,列表一个单一的Hadoop应用程序,能够和运行不一样版本的HDFS和MapReduce集群通讯。

最后咱们但愿Avro容许Hadoop应用程序更容易使用Java之外的语言编写。例如,一旦基于Avro,咱们但愿用像Python/C/C++支持原生的MapReduce和HDFS.

相关文章
相关标签/搜索