序列化存储指的是将数据结构转化为字节流的过程,一般用于数据存储或者网络传输.与之相反, 反序列化是将字节流转化为数据结果的过程.序列化是分布处理系统(比如Hadoop)的核心,原因在于他能对数据进行转化,形成一种格式.使用了这样的格式之后,数据可以有效的存储,也能通过网络连接进行传输.序列化通常与分布式系统中数据处理的两个方面紧密连接:进程间的通信(比如他远程过程调用,即Remote Prucedure Call RPC),以及数据存储.

Hadoop主要采用的序列化格式为Writables.Writables的特点是紧密,快速.但是脱离Java语言不便于扩展和使用.不过Hadoop生态系统中也有越发普及的其他序列化的框架,包括Thrift,Protocol Buffers 与Avro. 其中Avro的适用性最好,因为它创建的初中就是解除Hadoop Writables的限制.

1 Thrift

Thrift 是Facebook公司开发的框架,用于实现跨语言提供服务接口.Thrift使用接口定义语言(Interface Definition Language, IDL)定义服务接口,而且依据IDL文件自动生成桩代码(stub code),使用这些代码的RPC客户端与服务器,能够跨平台通信.

2 Protocol Buffers

Protocol Buffers(prorobuf)格式由Google公司开发,用于在不同语言编写的服务之间完成数据交换 ,与Thrift类似,Protobuf的结构由一个IDL文件定义,IDL用于为不同的语言创建桩代码.与Thrift类似的是,Protocol Buffers 不支持记录的内部压缩,不可分片,而且缺少MapReduce的原生支持.但是,同样与Thrift类似,Elephant Bird项目可以用于编码protobuf记录,支持MapReduce,压缩以及分片.

3 Avro

Avro是一种和语言无关的数据序列化系统,其设计初衷是解决Hadoop Writables的主要缺点,即缺少跨语言的可移植性支持.与Thrift和Protocol Buffers相同的是,Avr的数据描述也无关语言.与Thrift和Protocol Buffers不同的是,Avro可以选择生成代码,也可以选择不生成代码.因为Avro将模式存储于每个文件的头部,所以每个文件都是自描述的(self-documenting).Avro文件都很容易读取,即使是用一种语言写入数据,而另外一种语言类读取,也没有影响.Avro为MapReduce提供了更好的原生支持.因为Avro的数据可压缩可分片.Avro的另一个重要特点是支持模式演进(schema evolution),这一特点使得Avro比SequenceFile更适合Hadoop应用.也就是说,读取文件的模式不需要与邪恶如文件的模式严格匹配.于是,当需求发生变更的时候,模式中可以添加新的字段

Avro通常都是以JSON格式定义,但是也可以用Avro IDL定义,如前所述,模式存储于文件的头部,是文件元数据的一部分.除了元数据,文件头部还八廓一个唯一的同步标志.与SequenceFile类似,这个同步标志用于隔开文件中的数据块.从而使Avro文件支持分片.每个Avro文件的头部后面都有一系列的数据块,包含序列化后的Avro对象.这些数据块可以压缩.而且,各种数据以原格式存储在这些数据块中,这也为压缩提供了额外的帮助.

Avro定义了少量的基本类型.包括 Boolean int float和string .它也支持array map和enum等复杂类型

最新文章

  1. php 2038年问题
  2. 勇者斗恶龙UVa11292 - Dragon of Loowater
  3. WAMP启动失败简单解决方法
  4. Go-Agent原理分析及FQ介绍
  5. 苹果5S指纹扫描识别传感器Touch ID有利于iPhone的安全性
  6. python类及其方法
  7. Ztree异步加载自动展开节点
  8. linux学习笔记 2013-09-02
  9. jQuery Mobile 基础(第三章)
  10. UITableView性能优化
  11. C++文件操作详解(ifstream、ofstream、fstream)
  12. Windows 8.1 正式版 MSDN第二版 官方简体中文/英文版 (专业版/企业版)
  13. p1217晚餐(简单的dijkstra)
  14. golang微信公众号请求获取信息
  15. P1462 通往奥格瑞玛的道路 (二分+最短路)
  16. 高度可配置的 Linux 内存守护程序 Nohang!
  17. python中利用上下文管理器来实现mysql数据库的封装
  18. LeetCode-111.Mininum Depth of Binary Tree
  19. php学习笔记之动态生成一组单选button
  20. 9款极具创意的HTML5/CSS3进度条动画

热门文章

  1. superset使用
  2. [转帖]Grafana背后的Nginx和Apache Proxy
  3. Linux-echo:打印彩色输出
  4. ABP创建应用服务
  5. php 数组相关方法的一些实际妙用
  6. T100——上传图片
  7. 树莓派安装SSH
  8. mybatis+oracle批量插入报不符合协议和sql未正确结束
  9. sftp上传文件(Renci.SshNet)和代理上传
  10. linq to xml运用示例