http://my.oschina.net/u/138995/blog/177925
2015-09-07 17:08
225 查看
Hadoop序列化与Writable接口
序列化(serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储;相对的反序列化(deserialization)是指将字节流转回到结构化对象的过程。
在分布式系统中进程将对象序列化为字节流,通过网络传输到另一进程,另一进程接收到字节流,通过反序列化转回到结构化对象,以达到进程间通信。(使用范围)在Hadoop中,Mapper,Combiner,Reducer等阶段之间的通信都需要使用序列化与反序列化技术。举例来说,Mapper产生的中间结果(<key: value1, value2...>)需要写入到本地硬盘(用途一),这是序列化过程(将结构化对象转化为字节流,并写入硬盘),而Reducer阶段读取Mapper的中间结果的过程则是一个反序列化过程(读取硬盘上存储的字节流文件,并转回为结构化对象).需要注意的是,能够在网络上传输(用途二)的只能是字节流,Mapper的中间结果在不同主机间洗牌时,对象将经历序列化和反序列化两个过程。序列化是Hadoop核心的一部分,在Hadoop中,位于org.apache.hadoop.io包中的Writable接口是Hadoop序列化格式的实现。
Writable接口
Hadoop Writable接口是基于DataInput和DataOutput实现的序列化协议,紧凑(高效使用存储空间),快速(读写数据、序列化与反序列化的开销小)。Hadoop中的键(key)和值(value)必须是实现了Writable接口的对象(键还必须实现WritableComparable,以便进行排序)。以下是Hadoop(使用的是Hadoop 1.1.2)中Writable接口的声明:
?
Writable类
Hadoop自身提供了多种具体的Writable类,包含了常见的Java基本类型(boolean、byte、short、int、float、long和double等)和集合类型(BytesWritable、ArrayWritable和MapWritable等)。这些类型都位于org.apache.hadoop.io包中。(图片来源:safaribooksonline.com)
定制Writable类
虽然Hadoop内建了多种Writable类提供用户选择,Hadoop对Java基本类型的包装Writable类实现的RawComparable接口,使得这些对象不需要反序列化过程,便可以在字节流层面进行排序,从而大大缩短了比较的时间开销,但是当我们需要更加复杂的对象时,Hadoop的内建Writable类就不能满足我们的需求了(需要注意的是Hadoop提供的Writable集合类型并没有实现RawComparable接口,因此也不满足我们的需要),这时我们就需要定制自己的Writable类,特别将其作为键(key)的时候更应该如此,以求达到更高效的存储和快速的比较。下面的实例展示了如何定制一个Writable类,一个定制的Writable类首先必须实现Writable或者WritableComparable接口,然后为定制的Writable类编写write(DataOutput out)和readFields(DataInput in)方法,来控制定制的Writable类如何转化为字节流(write方法)和如何从字节流转回为Writable对象。
?
相关文章推荐
- CAPI3 HTTP文件服务器搭建(共享目录版)
- 98 AFNetworking网络状态监控
- Eclipse网络求情返回数据多显示不全的处理
- Linux access()函数 使用 http://blog.163.com/lqy_super/blog/static/199751021201302351831330/
- IP地址的分类——a,b,c 类是如何划分的
- TCP的流量控制和拥塞控制 (小结)
- hdu 4284 Travel 2012天津网络赛 状压dp TSP 最短路
- 用HttpUrlConnection抓取网页内容
- TCP-IP协议详解(11) 涅槃 (TCP重新发送)
- java httpURL连接远程服务器并返回数据(httpurlconnection)
- TCP/IP详解之IP协议ARP协议和RARP协议
- TCP-IP协议详解(10) 魔鬼细节 (TCP滑窗管理)
- httpclient远程调用,返回xml
- HttpClient使用详解
- nginx 的简单配置(虚拟主机、来源控制、https)
- 分布式网络爬虫架构-技术选型
- 利用Git和TortoiseGit把代码传输到网络服务器
- Http通用短信接口开发经验及具体开发实现
- HTTP参数CONNETCTION_TIMEOUT和SO_TIMEOUT区别
- 功能测试的测试工作流程