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.    * 为了效率,请尽可能复用现有的对象  
  12.    * @param in DataInput流,从该流中读取数据  
  13.    * @throws IOException  
  14.    */  
  15.   void readFields(DataInput in) throws IOException;  
  16. }  

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.  
  13.  public void readFields(DataInput in) throws IOException {  
  14.      this.blockId = in.readLong();  
  15.      this.numBytes = in.readLong();  
  16.      this.generationStamp = in.readLong();  
  17.      if (numBytes < 0) {  
  18.         throw new IOException("Unexpected block size: " + numBytes);  
  19.      }  
  20.   }  
  21.   ……  
  22. }  

这个例子使用的是前面分析Java序列化机制的Block类,Block实现了Writable接口,即需要实现write()方法和readFields()方法,这两个方法的实现都很简单:Block有三个成员变量,write()方法简单地把这三个变量写入流中,而readFields()则从流中依次读入这些数据,并做必要的检查。

Hadoop序列化机制中还包括另外几个重要接口:WritableComparable、RawComparator和WritableComparator。

WritableComparable,顾名思义,它提供类型比较的能力,这对MapReduce至关重要。该接口继承自Writable接口和Comparable接口,其中Comparable用于进行类型比较。ByteWritable、IntWritable、DoubleWritable等Java基本类型对应的Writable类型,都继承自WritableComparable。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值