遗留问题:
  • Hadoop序列化可以复用对象,是在哪里复用的?
  1. 介绍Hadoop序列化机制
  2. Hadoop序列化机制详解
    1. Hadoop序列化的核心
    2. Hadoop序列化的比较接口
    3. ObjectWritable类
  3. 参考
    1. Comparable 和 Comparator
    2. ConcurrentHashMap
 
 
介绍Hadoop序列化机制
 
     JAVA的序列化机制是在对象流ObjectOutputStream对象上调用writeObject 方法。Hadoop的序列化机制是通过write函数将对象序列化到流中。Hadoop序列化可以复用对象,这样会节省系统开销。
 
Hadoop序列化机制详解
 
1.Hadoop序列化的核心
     Hadoop序列化的核心是Writable接口,所有的实现这个接口的对象,都是可以序列化的。Writable有两个方法,一个是将序列化的对象写入流中,一个是从流中读取对象。
 
public interface Writable {
/**
* Serialize the fields of this object to <code>out</code>.
*
* @param out <code>DataOuput</code> to serialize this object into.
* @throws IOException
*/
void write(DataOutput out) throws IOException; /**
* Deserialize the fields of this object from <code>in</code>.
*
* <p>For efficiency, implementations should attempt to re-use storage in the
* existing object where possible.</p>
*
* @param in <code>DataInput</code> to deseriablize this object from.
* @throws IOException
*/
void readFields(DataInput in) throws IOException;
}
 
 2.Hadoop序列化的比较接口
Hadoop中重要的比较接口有WritableComparable, RawComparator 和 WritableComparator。WritableComparable如下:
 
public interface WritableComparable<T> extends Writable, Comparable<T> {
}
 该接口继承了Writable 和Comparable接口。所有实现WritableComparable的序列化类型都会实现CompareTo类型。例如IntWritable类型:

public class IntWritable implements WritableComparable<VIntWritable> {
/** Compares two IntWritables. */
@Override
public int compareTo(IntWritable o) {
int thisValue = this.value;
int thatValue = o.value;
return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
} }
 
RawComparator 继承了Comparator接口,该接口包含一个compare函数,用来从流中读取内容,并进行比较,避免了对象的创建。
 
public interface RawComparator<T> extends Comparator<T> {

  /**
* Compare two objects in binary.
* b1[s1:l1] is the first object, and b2[s2:l2] is the second object.
*
* @param b1 The first byte array.
* @param s1 The position index in b1. The object under comparison's starting index.
* @param l1 The length of the object in b1.
* @param b2 The second byte array.
* @param s2 The position index in b2. The object under comparison's starting index.
* @param l2 The length of the object under comparison in b2.
* @return An integer result of the comparison.
*/
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2); }
WritableComparator 是 RawComparator 对 WritableComparable 类 的 一个 通用实现。它有两个功能:
    a.提供了一个compare的默认实现,从数据流中反序列化要比较的对象,然后调用Compare函数进行比较。
    b.充当了RawComparator实例的一个工厂方法。
    在所有的定长类型的类中都会有一个静态类继承WritableComparator ,并实现 compare 函数,然后通过define函数注册到WritableComparator类的 ConcurrentHashMap中。

@Override
public String toString() {
return Integer.toString(value);
} /** A Comparator optimized for IntWritable. */
public static class Comparator extends WritableComparator {
public Comparator() {
super(IntWritable.class);
} @Override
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));
}
} static { // register this comparator
WritableComparator.define(IntWritable.class, new Comparator());
}
 
 3. ObjectWritable类
 
ObjectWritable类对所有的序列化类型进行了封装,然后实现对象的序列化和反序列化。具体过程如下:
1.如果declaredClass是一个数组,对数组中的每个declaredClass对象调用WriteObject()。
2.如果declaredClass对象是一个ArrayPrimitiveWritable类型的,调用Array类型的Write函数。
3.如果declaredClass是 PrimitiveWritable类型的,对不同的类型调用不同的write***函数。
4.如果declaredClass是enum类型的,写入enum的名字。
5.如果declaredClass是Writable类型的,写入对象实例的类名。
 

参考
1.comparable 和 comparator
 
2.ConcurrentHashMap
 
 
 

Hadoop序列化的更多相关文章

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

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

  2. hadoop序列化机制与java序列化机制对比

    1.采用的方法: java序列化机制采用的ObjectOutputStream 对象上调用writeObject() 方法: Hadoop 序列化机制调用对象的write() 方法,带一个DataOu ...

  3. Hadoop序列化与Java序列化

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

  4. 自定义排序及Hadoop序列化

    自定义排序 将两列数据进行排序,第一列按照升序排列,当第一列相同时,第二列升序排列. 在map和reduce阶段进行排序时,比较的是k2.v2是不参与排序比较的.如果要想让v2也进行排序,需要把k2和 ...

  5. Hadoop序列化机制及实例

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

  6. Hadoop序列化与Writable接口(二)

    Hadoop序列化与Writable接口(二) 上一篇文章Hadoop序列化与Writable接口(一)介绍了Hadoop序列化,Hadoop Writable接口以及如何定制自己的Writable类 ...

  7. Hadoop序列化与Writable接口(一)

    Hadoop序列化与Writable接口(一) 序列化 序列化(serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储:相对的反序列化(deserial ...

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

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

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

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

随机推荐

  1. DJANGO变动库的一次真实手动经历

    在变更库时,由于对字段规划和约束性没考虑完全,需要手工操作数据库,以便可以重复执行. 有以下三点要注意. 1,先迎合错误输出,增删对应的表或字段. 2,必要时,修改migrations文件,以去除唯一 ...

  2. hdu 1352 I Conduit!

    计算几何,主要是排序问题,其他都很好做…… ;}

  3. Oracle 学习笔记(三)

    1.插入有日期的表,使用 to_date 函数 to_date('1992-12-07', 'yyyy-mm-dd'); 2.使用update更新语句的时候,既可以使用表达式或者数值直接修改数据,也可 ...

  4. 毕向东JAVA视频讲解笔记(前三课)

    1,定义一个类,因为java程序都定义类中,java程序都是以类的形式存在的,类的形式其实就是一个字节码文件最终体现. 2,定义一个主函数.为了让该类可以独立运行. 3,因为演示hello world ...

  5. 【Linux高频命令专题(22)】gzip

    概述 减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅 ...

  6. POSIX semaphore: sem_open, sem_close, sem_post, sem_wait

    http://www.cnblogs.com/BloodAndBone/archive/2011/01/18/1938552.html 一.Posix有名信号灯 1.posix有名信号灯函数 函数se ...

  7. C和指针贴图

    ANSI C 算术转换 内存操作函数 打开流 关闭流 IO函数常用模式 字符输入函数 字符输出函数 撤销字符 未格式化的行IO 格式化的行IO-scanf家族 格式化IO-printf家族 print ...

  8. Hibernate逍遥游记-第5章映射一对多-02双向(<set>、<key>、<one-to-many>、inverse、cascade="all-delete-orphan")

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...

  9. Servlet获取当前服务器的实际路径

    Servlet/Jsp需要操作服务器所拥有的资源,为此需要得到其绝对路径或实际路径, 在Servlet的doGet方法中加入以下代码可以查看服务器的实际路径. package com.mhb; imp ...

  10. csh与bash比较

    csh与bash比较:一.csh的while循环控制结构及if then:#!/bin/csh -fwhile ($#argv >= 1)  if ("$1" == &quo ...