原文: 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不需要它。

存储全部的数据结构定义和数据的另外一个优势是允许数据被更快更简洁的写入。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.

Apache Avro:一个新的数据交换格式的更多相关文章

  1. 数据交换格式与SpringIOC底层实现

    1.数据交换格式 1.1 有哪些数据交换格式 客户端与服务器常用数据交换格式xml.json.html 1.2 数据交换格式应用场景 1.2.1 移动端(安卓.iOS)通讯方式采用http协议+JSO ...

  2. 【学习】006数据交换格式与SpringIOC底层实现

    课程目标 XML和JSON Java反射机制 手写SpringIOC 什么是数据交换格式 客户端与服务器常用数据交换格式xml.json.html 数据交换格式用场景 移动端(安卓.IOS)通讯方式采 ...

  3. 常用两种数据交换格式之XML和JSON的比较

    目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生: 相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你 ...

  4. JSON——IT技术人员都必须要了解的一种数据交换格式

    JSON作为目前Web主流的数据交换格式,是每个IT技术人员都必须要了解的一种数据交换格式.尤其是在Ajax和REST技术的大行其道的当今,JSON无疑成为了数据交换格式的首选! 今天大家就和猪哥一起 ...

  5. Atitit.常见软件 数据 交换格式 标准

    Atitit.常见软件 数据 交换格式 标准 1. 常见的数据格式txt ,doc ,pic,music ,vodio1 2. 通用格式json yaml phpstr1 3. 专用格式1 4. 用户 ...

  6. 在.NET使用JSON作为数据交换格式

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhoufoxcn.blog.51cto.com/792419/517093 我们 ...

  7. json 数据交换格式与java

    http://wiki.mbalib.com/wiki/数据交换 数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程. 数据 ...

  8. NDEF-NFC数据交换格式

    为实现NFC标签.NFC设备以及NFC设备之间的交互通信,NFC论坛(NFC FROUM)定义了称为NFC数据交换格式(NDEF)的通用数据格式.NDEF是轻量级的紧凑的二进制格式,可带有URL,vC ...

  9. XML和JSON两种数据交换格式的比较

    在web开发领域,主要的数据交换格式有XML和JSON,对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的.一般都输出Json不输出xml,原因就是因为 x ...

随机推荐

  1. LruCache DiskLruCache 缓存 简介 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Sqlserver获取行号

    Sqlserver获取行号   select row_number()over(order by userid )as RowNum,*from OUM_User

  3. IOS APP开发UI上的尺寸注意问题(屏幕、适配、分辨率)

  4. SQL语法 之 表连接

    一.连接条件 连接查询中用来连接连个表的条件称为连接条件或连接谓词.其形式为: [<表1>].<列名1> <连接运算符> [<表2>].<列2&g ...

  5. Python 更新set

    更新set 由于set存储的是一组不重复的无序元素,因此,更新set主要做两件事: 一是把新的元素添加到set中,二是把已有元素从set中删除. 添加元素时,用set的add()方法: weekday ...

  6. MySQL 工具

    MySQL 客户端工具: 1:mysql       #mysql的功能和Oracle的sqlplus一样,它为用户提供一个命令行接口来管理Mysql服务器. 2:mysqladmin #mysqla ...

  7. js正则表达式test方法、exec方法与字符串search方法区别

    1.正则表达式test方法 test() 方法用于检测一个字符串是否匹配某个模式 返回值: 如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 fal ...

  8. TensorFlow编译androiddemo

    首先是把tensorflow克隆到本地一份. git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git 既 ...

  9. unix 网络编程 第七章

    1     getsockopt和setsockopt函数 套接字选项粗分为两大基本类型:一是启用或禁止某个特性的二元选项,二是取得并返回特定值的选项,参数都是以指针形式传入的. 2     套接字状 ...

  10. centos6.5下使用yum完美搭建LNMP环境(php5.6,mysql5.5,nginx1.10)

    准备工作 配置防火墙,开启80端口.3306端口 不用执行这句:rm -rf /etc/sysconfig/iptables 直接进入修改:vi /etc/sysconfig/iptables 添加8 ...