Hadoop Writable机制
《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》第3章序列化与压缩,本章涉及了org.apache.hadoop.io包下最重要的两部分内容:序列化和压缩。本节为大家介绍Hadoop Writable机制。
AD:WOT2015 互联网运维与开发者大会 热销抢票
3.1.4 Hadoop Writable机制
为了支持以上这些特性,Hadoop引入org.apache.hadoop.io.Writable接口,作为所有可序列化对象必须实现的接口,其类图如图3-2所示。
Writable机制紧凑、快速(但不容易扩展到Java以外的语言,如C、Python等)。和java.io.Serializable不同,Writable接口不是一个说明性接口,它包含两个方法:
- public interface Writable {
- /**
- * 输出(序列化)对象到流中
- * @param out DataOuput流,序列化的结果保存在流中
- * @throws IOException
- */
- void write(DataOutput out) throws IOException;
- /**
- * 从流中读取(反序列化)对象
- * 为了效率,请尽可能复用现有的对象
- * @param in DataInput流,从该流中读取数据
- * @throws IOException
- */
- void readFields(DataInput in) throws IOException;
- }
Writable.write()方法用于将对象状态写入二进制的DataOutput中,反序列化的过程由readFields()从DataInput流中读取状态完成。下面是一个例子:
- public class Block implements Writable, Comparable<Block>, Serializable {
- ……
- private long blockId;
- private long numBytes;
- private long generationStamp;
- ……
- public void write(DataOutput out) throws IOException {
- out.writeLong(blockId);
- out.writeLong(numBytes);
- out.writeLong(generationStamp);
- }
- public void readFields(DataInput in) throws IOException {
- this.blockId = in.readLong();
- this.numBytes = in.readLong();
- this.generationStamp = in.readLong();
- if (numBytes < 0) {
- throw new IOException("Unexpected block size: " + numBytes);
- }
- }
- ……
- }
这个例子使用的是前面分析Java序列化机制的Block类,Block实现了Writable接口,即需要实现write()方法和readFields()方法,这两个方法的实现都很简单:Block有三个成员变量,write()方法简单地把这三个变量写入流中,而readFields()则从流中依次读入这些数据,并做必要的检查。
Hadoop序列化机制中还包括另外几个重要接口:WritableComparable、RawComparator和WritableComparator。
WritableComparable,顾名思义,它提供类型比较的能力,这对MapReduce至关重要。该接口继承自Writable接口和Comparable接口,其中Comparable用于进行类型比较。ByteWritable、IntWritable、DoubleWritable等Java基本类型对应的Writable类型,都继承自WritableComparable。
效率在Hadoop中非常重要,因此HadoopI/O包中提供了具有高效比较能力的RawComparator接口。RawComparator和WritableComparable类图如图3-3所示。
RawComparator接口允许执行者比较流中读取的未被反序列化为对象的记录,从而省去了创建对象的所有开销。其中,compare()比较时需要的两个参数所对应的记录位于字节数组b1和b2的指定开始位置s1和s1,记录长度为l1和l2,代码如下:
- public interface RawComparator<T>extends
- Comparator<T> {
- public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);
- }
以IntWritable为例,它的RawComparator实现中(WritableComparator是一个辅助类,实现了RawComparator接口),compare()方法通过readInt()直接在字节数组中读入需要比较的两个整数,然后输出Comparable接口要求的比较结果。值得注意的是,该过程中compare()方法避免使用IntWritable对象,从而避免了不必要的对象分配。相关代码如下:
- public static class Comparator extends WritableComparator {
- ……
- public int compare(byte[] b1, int s1, int l1,
- byte[] b2, int s2, int l2) {
- int thisValue = readInt(b1, s1);
- int thatValue = readInt(b2, s2);
- return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
- }
- ……
- }
WritableComparator是RawComparator对WritableComparable类的一个通用实现。它提供两个主要功能。首先,提供了一个RawComparator的compare()默认实现,该实现从数据流中反序列化要进行比较的对象,然后调用对象的compare()方法进行比较(这些对象都是Comparable的)。其次,它充当了RawComparator实例的一个工厂方法,例如,可以通过如下代码获得IntWritable的RawComparator:
- RawComparator<IntWritable>comparator=
- WritableComparator.get(IntWritable.class);
Hadoop Writable机制相关推荐
- 大数据学习笔记29:Hadoop压缩机制演示
文章目录 一.Hadoop压缩机制 1.两种Hadoop自带压缩格式 2.常用压缩格式优缺点及应用场景 (1)gzip压缩 (2)bzip2压缩 (3)lzo压缩 (4)snappy压缩 二.Java ...
- Hadoop DFS源码研究之---Hadoop RPC机制
先记录server端的机制 最初接触RPC,用自己的思路来猜测RPC的实现机制: Server端开启socket监听,listen()à accept()àread()àwrite()àclose() ...
- Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- hadoop心跳机制解析
心跳的机制大概是这样的: 1) master启动的时候,会开一个ipc server在那里. 2) slave启动时,会连接master,并每隔3秒钟主动向master发送一个"心跳&quo ...
- Hadoop心跳机制
心跳是Jobtracker和Tasktracker的桥梁,它实际上是一个RPC函数,Tasktracker周期性的调用该函数汇报节点和任务状态信息,从而形成心跳.在hadoop中,心跳主要有三个作用: ...
- Hadoop核心机制详细解析
Hadoop的核心机制是通过HDFS文件系统和MapReduce算法进行存储资源.内存和程序的有效利用与管理.在现实的实例中,通过Hadoop,可以轻易的将多台普通的或低性能的服务器组合成分布式的运算 ...
- Hadoop HA 机制学习:HA是怎么运作,QJM又是怎么发挥功效的
一.Hadoop 系统架构 1.1 Hadoop1.x和Hadoop2.x 架构 在介绍HA之前,我们先来看下Hadoop的系统架构,这对于理解HA是至关重要的.Hadoop 1.x之前,其官方架构如 ...
- Hadoop详解(十):Hadoop 作业调度机制
Hadoop 作为一个分布式计算平台,从集群计算的角度分析,Hadoop可以将底层的计算资源整合后统一分配到集群中的计算节点,从而达到分布式和并行计算的目的,最终完成任务的高效执行.在调度机制中涉及的 ...
- Hadoop技术之Hadoop HA 机制学习
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:温球良 导语 最近分享过一次关于Hadoop技术主题的演讲,由于接触时间不长,很多技术细节认识不够,也没讲清楚,作为一个技术人员,本 ...
最新文章
- python相关概念
- LINQ中的动态排序
- html调用静态json例子
- 地铁看java书女生_地铁上背单词的女孩
- mysql 索引原理_MySQL InnoDB索引原理和算法
- 系统架构——从Memcache单点说起
- Jade linux 位置,jade 6.5 安装教程
- m序列产生原理及其性质
- RS422-RS485-RS232标准接线
- javascript常用单词记忆
- 宝藏水晶VRay材质球素材,速来收藏
- 数字图像处理(18): 图像灰度变换——线性灰度变换 和 非线性灰度变换(对数变换 与 伽马变换)
- 老年人计算机培训信息,老年人学习电脑基础知识
- PHPCMSV9 企业黄页 黄页企业模板添加方法
- Windows操作系统深入解析原理
- SCOI2012 喵星球上的点名 BZOJ 2754
- 电信光猫重置后与路由器重新配置实现正常上网
- linux双网卡网段互通,linux环境中,两个不同网段的机器互通
- 华为OD机试真题2023(JavaScript)
- 贾伟专访:我的内心住着一个女孩