《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接口不是一个说明性接口,它包含两个方法:

  1. public interface Writable {
  2. /**
  3. * 输出(序列化)对象到流中
  4. * @param out DataOuput流,序列化的结果保存在流中
  5. * @throws IOException
  6. */
  7. void write(DataOutput out) throws IOException;
  8. /**
  9. * 从流中读取(反序列化)对象
  10. * 为了效率,请尽可能复用现有的对象
  11. * @param in DataInput流,从该流中读取数据
  12. * @throws IOException
  13. */
  14. void readFields(DataInput in) throws IOException;
  15. }

Writable.write()方法用于将对象状态写入二进制的DataOutput中,反序列化的过程由readFields()从DataInput流中读取状态完成。下面是一个例子:

  1. public class Block implements Writable, Comparable<Block>, Serializable {
  2. ……
  3. private long blockId;
  4. private long numBytes;
  5. private long generationStamp;
  6. ……
  7. public void write(DataOutput out) throws IOException {
  8. out.writeLong(blockId);
  9. out.writeLong(numBytes);
  10. out.writeLong(generationStamp);
  11. }
  12. public void readFields(DataInput in) throws IOException {
  13. this.blockId = in.readLong();
  14. this.numBytes = in.readLong();
  15. this.generationStamp = in.readLong();
  16. if (numBytes < 0) {
  17. throw new IOException("Unexpected block size: " + numBytes);
  18. }
  19. }
  20. ……
  21. }

这个例子使用的是前面分析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,代码如下:

  1. public interface RawComparator<T>extends
  2. Comparator<T> {
  3. public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);
  4. }

以IntWritable为例,它的RawComparator实现中(WritableComparator是一个辅助类,实现了RawComparator接口),compare()方法通过readInt()直接在字节数组中读入需要比较的两个整数,然后输出Comparable接口要求的比较结果。值得注意的是,该过程中compare()方法避免使用IntWritable对象,从而避免了不必要的对象分配。相关代码如下:

  1. public static class Comparator extends WritableComparator {
  2. ……
  3. public int compare(byte[] b1, int s1, int l1,
  4. byte[] b2, int s2, int l2) {
  5. int thisValue = readInt(b1, s1);
  6. int thatValue = readInt(b2, s2);
  7. return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
  8. }
  9. ……
  10. }

WritableComparator是RawComparator对WritableComparable类的一个通用实现。它提供两个主要功能。首先,提供了一个RawComparator的compare()默认实现,该实现从数据流中反序列化要进行比较的对象,然后调用对象的compare()方法进行比较(这些对象都是Comparable的)。其次,它充当了RawComparator实例的一个工厂方法,例如,可以通过如下代码获得IntWritable的RawComparator:

  1. RawComparator<IntWritable>comparator=
  2. WritableComparator.get(IntWritable.class);

Hadoop Writable机制相关推荐

  1. 大数据学习笔记29:Hadoop压缩机制演示

    文章目录 一.Hadoop压缩机制 1.两种Hadoop自带压缩格式 2.常用压缩格式优缺点及应用场景 (1)gzip压缩 (2)bzip2压缩 (3)lzo压缩 (4)snappy压缩 二.Java ...

  2. Hadoop DFS源码研究之---Hadoop RPC机制

    先记录server端的机制 最初接触RPC,用自己的思路来猜测RPC的实现机制: Server端开启socket监听,listen()à accept()àread()àwrite()àclose() ...

  3. Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  4. hadoop心跳机制解析

    心跳的机制大概是这样的: 1) master启动的时候,会开一个ipc server在那里. 2) slave启动时,会连接master,并每隔3秒钟主动向master发送一个"心跳&quo ...

  5. Hadoop心跳机制

    心跳是Jobtracker和Tasktracker的桥梁,它实际上是一个RPC函数,Tasktracker周期性的调用该函数汇报节点和任务状态信息,从而形成心跳.在hadoop中,心跳主要有三个作用: ...

  6. Hadoop核心机制详细解析

    Hadoop的核心机制是通过HDFS文件系统和MapReduce算法进行存储资源.内存和程序的有效利用与管理.在现实的实例中,通过Hadoop,可以轻易的将多台普通的或低性能的服务器组合成分布式的运算 ...

  7. Hadoop HA 机制学习:HA是怎么运作,QJM又是怎么发挥功效的

    一.Hadoop 系统架构 1.1 Hadoop1.x和Hadoop2.x 架构 在介绍HA之前,我们先来看下Hadoop的系统架构,这对于理解HA是至关重要的.Hadoop 1.x之前,其官方架构如 ...

  8. Hadoop详解(十):Hadoop 作业调度机制

    Hadoop 作为一个分布式计算平台,从集群计算的角度分析,Hadoop可以将底层的计算资源整合后统一分配到集群中的计算节点,从而达到分布式和并行计算的目的,最终完成任务的高效执行.在调度机制中涉及的 ...

  9. Hadoop技术之Hadoop HA 机制学习

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:温球良 导语 最近分享过一次关于Hadoop技术主题的演讲,由于接触时间不长,很多技术细节认识不够,也没讲清楚,作为一个技术人员,本 ...

最新文章

  1. python相关概念
  2. LINQ中的动态排序
  3. html调用静态json例子
  4. 地铁看java书女生_地铁上背单词的女孩
  5. mysql 索引原理_MySQL InnoDB索引原理和算法
  6. 系统架构——从Memcache单点说起
  7. Jade linux 位置,jade 6.5 安装教程
  8. m序列产生原理及其性质
  9. RS422-RS485-RS232标准接线
  10. javascript常用单词记忆
  11. 宝藏水晶VRay材质球素材,速来收藏
  12. 数字图像处理(18): 图像灰度变换——线性灰度变换 和 非线性灰度变换(对数变换 与 伽马变换)
  13. 老年人计算机培训信息,老年人学习电脑基础知识
  14. PHPCMSV9 企业黄页 黄页企业模板添加方法
  15. Windows操作系统深入解析原理
  16. SCOI2012 喵星球上的点名 BZOJ 2754
  17. 电信光猫重置后与路由器重新配置实现正常上网
  18. linux双网卡网段互通,linux环境中,两个不同网段的机器互通
  19. 华为OD机试真题2023(JavaScript)
  20. 贾伟专访:我的内心住着一个女孩

热门文章

  1. 取消任务栏中又出现了红色的盾牌
  2. Python的5种传参姿势,两分钟就能了解
  3. 打造政产学研新型研发机构 加速人工智能科研成果转化
  4. DELL服务器利用OMSA修改BIOS设置
  5. Moodle安全漏洞如何启动远程代码执行?
  6. phpstudy易犯的错误
  7. zabbix监控交换机出图断断续续
  8. 把cygwin加入右键菜单
  9. Centos 7 下 Corosync + Pacemaker + DRBD + psc + crmsh 实现 mysql 服务高可用
  10. Hdoj 1846.Brave Game 题解