Hadoop提供了Writable以提供序列化功能,write方法用于将数据写入流中,readFields方法用于从流中读取数据

public interface Writable {void write(DataOutput out) throws IOException;void readFields(DataInput in) throws IOException;
}

Hadoop对于Java常用类都实现了对应的Writable方法,以BooleanWritable为例,对于基础的类型,只是简单的写入与读取
  @Overridepublic void readFields(DataInput in) throws IOException {value = in.readBoolean();}@Overridepublic void write(DataOutput out) throws IOException {out.writeBoolean(value);}

BooleanWritable实现了WritableComparable接口,为其提供比较的能力

同时Hadoop定义了RawComparator接口,以提供比较流中未被反序列化的数据的能力,提高比较的效率

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

Hadoop提供了对RawComparator的基础实现WritableComparator

  public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {try {buffer.reset(b1, s1, l1);                   // parse key1
      key1.readFields(buffer);buffer.reset(b2, s2, l2);                   // parse key2
      key2.readFields(buffer);buffer.reset(null, 0, 0);                   // clean up reference} catch (IOException e) {throw new RuntimeException(e);}return compare(key1, key2);                   // compare them}

而在BooleanWritable类中,实现了继承WritableComparator的Comparator,并通过static方法注册到WritableComparator中

  public static class Comparator extends WritableComparator {public Comparator() {super(BooleanWritable.class);}@Overridepublic int compare(byte[] b1, int s1, int l1,byte[] b2, int s2, int l2) {return compareBytes(b1, s1, l1, b2, s2, l2);}}// 注册static {WritableComparator.define(BooleanWritable.class, new Comparator());}

可以通过WritableComparator.get方法根据具体的获取到对应比较器

  public static WritableComparator get(Class<? extends WritableComparable> c, Configuration conf) {WritableComparator comparator = comparators.get(c);if (comparator == null) {      forceInit(c);comparator = comparators.get(c);if (comparator == null) {comparator = new WritableComparator(c, conf, true);}}
    ReflectionUtils.setConf(comparator, conf);return comparator;}

Hadoop提供了通用的ObjectWritable类

private Class declaredClass;
private Object instance;
private Configuration conf;

declaredClass:对象的类instance:对象实例conf:对象运行时的配置ObjectWritable可以用于Hadoop的远程方法调用以及序列化不同的对象到同一个字段,但是ObjectWritable作为一种通用实现,会将类声明作为字符串添加到每一个Key-Value对中,造成较大的性能损失,因此Hadoop提供了GenericWritable对于少量类型数据,可以使用GenericWritable,预先缓存下所有的类型,通过类型编号对类型进行查找,以降低网络传输,但是GenericWritable也有明显的缺陷,即在类型不确定或者类型特别多的时候并不适用

转载于:https://www.cnblogs.com/tyler-jin/p/10424621.html

Hadoop 序列化相关推荐

  1. Hadoop之Hadoop序列化

    Hadoop之Hadoop序列化 目录 什么是序列化 为什么要序列化 为什么不用Java的序列化 常用数据序列化类型 自定义bean对象实现序列化接口(Writable) 1. 什么是序列化 序列化就 ...

  2. Hadoop序列化与Java序列化

    序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输 反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象. 1.JDK的序列化 只要实现了serial ...

  3. 他来了他来了,Hadoop序列化和切片机制了解一下?

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 切片机制 一个超大文件在HDFS上存储时,是以多个Block存储在不同的节点上,比如一个512M的 ...

  4. MapReduce快速入门系列(4) | Hadoop序列化

    Hello,大家好,本次为大家带来的是Hadoop的序列化操作. 目录 一. 序列化的简单介绍 1.1. 什么是序列化 1.2. 为什么要序列化 1.3. 为什么不用Java的序列化 二. 自定义be ...

  5. Hadoop序列化案例

    Hadoop序列化案例 统计每一个手机号耗费的总上行流量.总下行流量.总流量 数据: 1 13736230513 192.196.100.1 www.baidu.com 2481 24681 200 ...

  6. 代码实现——MapReduce实现Hadoop序列化

    简单介绍 1.什么是序列化 序列化:把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输. 反序列化:将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转 ...

  7. Hadoop序列化程序报错

    这个错误指向序列化类,注意实现的Read和Wirte顺序一定要一致,并且要使用基本类型,不要使用包装类. java.lang.Exception: java.io.EOFException at or ...

  8. 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序...

    一:序列化概念 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.即把字节流转回结构化对象. Java序列化(java.i ...

  9. hadoop 实现序列化

    前言 序列化想必大家都很熟悉了,对象在进行网络传输过程中,需要序列化之后才能传输到客户端,或者客户端的数据序列化之后送达到服务端 序列化的标准解释如下: 序列化就是把内存中的对象,转换成字节序列(或其 ...

最新文章

  1. java导出highcharts_java实现highcharts导出图片至excel
  2. php ios视频文件上传,iOS实现视频和图片的上传思路
  3. 段寄存器和8种地址寻址方式
  4. 购物车完善版,客户余额及所购商品保存在文件
  5. 算法专题(1)-信息学基本解题流程!
  6. [XSY4220] 九万步(结论)
  7. sql 动态写入数据库字段_批处理写入,动态SQL和参数化SQL,数据库的性能如何?...
  8. android8.0和9.0平板电脑区别,安卓9.0和8.0有什么区别? 哪个更好
  9. 读取文件卡顿_奥睿科IV300固态硬盘评测:35克,读取超900M/s?
  10. tomcat vue 不用 前后端_部署前后端分离项目(后端 tomcat 前端 nginx)
  11. 知名的开源apm(Application Performance Management)工具
  12. 阿里云 ECS Ubuntu 14.04 无法访问之磁盘 IO 跑满问题排查
  13. mysql中的like查询能否用的到索引
  14. RN:Android 开发记录
  15. C语言实现动态数字雨
  16. Allegro PCB 转 PADS Layout 之后的修修补补
  17. 误删阿里云mysql恢复数据恢复_阿里云数据库表数据误删恢复
  18. 小米手机android目录在哪里设置字体,在哪里修改小米手机的字体大小
  19. 文件资源管理器Ranger的使用
  20. X3D爱好者QQ群:47542302

热门文章

  1. python php 序列化,序列化和反序列化的详细介绍
  2. windows 搜索文件
  3. 网络安全之tcp阻截引擎 (一)
  4. 一个WIFI热点的脚本思路,顺记shell知识
  5. ORACLE删除表分区和数据
  6. php 解析返回的xml,php解析cas返回的xml解决思路
  7. 【kafka】kerberos认证下 kafka 报错Bootstrap broker host:ip (id: -1 rack: null) disconnected
  8. 【算法】剑指 Offer 03. 数组中重复的数字
  9. 1.1.0-简介-P11-分布式锁的解决方案
  10. 【clickhouse】clickhouse 原生监控