序列化存储指的是将数据结构转化为字节流的过程,一般用于数据存储或者网络传输.与之相反, 反序列化是将字节流转化为数据结果的过程.序列化是分布处理系统(比如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等复杂类型

Hadoop-No.3之序列化存储格式的更多相关文章

  1. hadoop深入研究:(十三)——序列化框架

    hadoop深入研究:(十三)--序列化框架 Mapreduce之序列化框架(转自http://blog.csdn.net/lastsweetop/article/details/9376495) 框 ...

  2. 为什么hadoop中用到的序列化不是java的serilaziable接口去序列化而是使用Writable序列化框架

    继上一个模块之后,此次分析的内容是来到了Hadoop IO相关的模块了,IO系统的模块可谓是一个比较大的模块,在Hadoop Common中的io,主要包括2个大的子模块构成,1个是以Writable ...

  3. Hadoop序列化机制及实例

    序列化 1.什么是序列化?将结构化对象转换成字节流以便于进行网络传输或写入持久存储的过程.2.什么是反序列化?将字节流转换为一系列结构化对象的过程.序列化用途: 1.作为一种持久化格式. 2.作为一种 ...

  4. Hadoop Serialization(third edition)hadoop序列化详解(最新版) (1)

    初学java的人肯定对java序列化记忆犹新.最开始很多人并不会一下子理解序列化的意义所在.这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java理解更加深刻之后,你就会发 ...

  5. 5.3.4 Hadoop序列化框架

    序列化框架 除了writable实现序列化之外,只要实现让类型和二进制流相互转换,都可以作为hadoop的序列化类型,为此Hadoop提供了一个序列化框架接口,他们在org.apache.hadoop ...

  6. Hadoop Serialization hadoop序列化详解(最新版) (1)【java和hadoop序列化比较和writable接口】

    初学java的人肯定对java序列化记忆犹新.最开始很多人并不会一下子理解序列化的意义所在.这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java理解更加深刻之后,你就会发 ...

  7. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  8. hadoop文件的序列化

    目录 1.为什么要序列化? 2.什么是序列化? 3.为什么不用Java的序列化? 4.为什么序列化对Hadoop很重要? 5.Hadoop中定义哪些序列化相关的接口呢? 6.Hadoop 自定义Wri ...

  9. java序列化是什么和反序列化和hadoop序列化

    1.什么是序列化和系列化DE- 神马是序列化它,序列化是内存中的对象状态信息,兑换字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什 ...

随机推荐

  1. SQLite基础-7.子句(一)

    目录 SQLite子句(一) 1. WHERE子句 2. LIKE子句 3. GLOB 子句 4. Oreder By 子句 SQLite子句(一) 1. WHERE子句 WHERE 子句后面跟着条件 ...

  2. css小记:hover 鼠标滑过让该元素的子元素或者其他元素改变样式

    <!DOCTYPE><head><meta http-equiv="Content-Type" content="text/html; ch ...

  3. pycharm 安装好,只要三部! 超级简单教程!

    pycharm的安装,确实比较麻烦,所以特意做了一期简单版本的安装教程,跟着教程走...只要三部! →下载 链接:https://pan.baidu.com/s/1JxZgAhPVKAIoM1_jpD ...

  4. Neo4j Cypher语法(三)

    目录 5 函数 5.1 谓词函数 5.2 标量函数 5.3 聚合函数 5.4 列表函数 5.5 数学函数 5.6 字符串函数 5.7 Udf与用户自定义函数 6 模式 6.1 索引 6.2 限制 7 ...

  5. java----FileInputStream类与FileReader类的区别(转)

    FileInputStream类与FileReader类的区别:两个类的构造函数的形式和参数都是相同的,参数为File对象或者表示路径的String,它们到底有何区别呢? Readers and W ...

  6. 序列化和反序列化在浏览器和 Web 服务器之间传递的数据、加密解密

    js中数组不能传递到后台,需进行json序列化: var data = new Array(); data.push({para1:name,para2:answer}); string data = ...

  7. JS基础_算数运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Python算法题(二)——国际象棋棋盘(排列组合问题,最小的K个数)

    题目一(输出国际象棋棋盘)  分析: 用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格.   主要代码: for i in range(8): for j in range(8 ...

  9. centos7安装nginx服务

    Nginx发音引擎x是一个免费的开源高性能HTTP和反向代理服务器,负责处理互联网上一些最大的网站的负载. 本教程将教你如何在你的CentOS Linux 7.5机器上安装和管理Nginx. 安装Ng ...

  10. 用<![CDATA[]]>将xml转义为 纯文本

    被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容"<". 此标记用于xml文档中,我们先 ...