Hadoop源码分析:Writable接口和WritableComparable接口

来源:互联网 发布:2016詹姆斯总决赛数据 编辑:程序博客网 时间:2024/05/21 00:19

1、 Writable接口

由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化。Hadoop并没有采用Java的序列化,而是引入了它自己的系统。
org.apache.hadoop.io中定义了大量的可序列化对象,他们都实现了Writable接口。

1.1 Writable接口源码

package org.apache.hadoop.io;import java.io.DataOutput;import java.io.DataInput;import java.io.IOException;import org.apache.hadoop.classification.InterfaceAudience;import org.apache.hadoop.classification.InterfaceStability;@InterfaceAudience.Public@InterfaceStability.Stablepublic interface Writable {  /**    * Serialize the fields of this object to <code>out</code>.   *    */  void write(DataOutput out) throws IOException;  /**    * Deserialize the fields of this object from <code>in</code>.     *    */  void readFields(DataInput in) throws IOException;}

1.2 自定义Writable实现类

实现了Writable接口的一个典型例子如下,该代码实际上是在Writable接口源码的注释中。

public class MyWritable implements Writable {       // Some data            private int counter;        private long timestamp;        public void write(DataOutput out) throws IOException {         out.writeInt(counter);         out.writeLong(timestamp);       }       public void readFields(DataInput in) throws IOException {        counter = in.readInt();         timestamp = in.readLong();       }      public static MyWritable read(DataInput in) throws IOException {        MyWritable w = new MyWritable();        w.readFields(in);        return w;       }    }

2 WritableComparable接口

WritableComparable是Writable接口和java.lang.Comparable的一个子接口。

2.1 WritableComparable接口源码

package org.apache.hadoop.io;import org.apache.hadoop.classification.InterfaceAudience;import org.apache.hadoop.classification.InterfaceStability;@InterfaceAudience.Public@InterfaceStability.Stablepublic interface WritableComparable<T> extends Writable, Comparable<T> {}

2.2 WritableComparable一个典型实现类

 public class MyWritableComparable implements WritableComparable<MyWritableComparable> {       // Some data        private int counter;        private long timestamp;        public void write(DataOutput out) throws IOException {          out.writeInt(counter);          out.writeLong(timestamp);        }        public void readFields(DataInput in) throws IOException {          counter = in.readInt();          timestamp = in.readLong();        }       public int compareTo(MyWritableComparable o) {          int thisValue = this.value;          int thatValue = o.value;          return (thisValue &lt; thatValue ? -1 : (thisValue==thatValue ? 0 : 1));        }      public int hashCode() {         final int prime = 31;         int result = 1;         result = prime * result + counter;         result = prime * result + (int) (timestamp ^ (timestamp &gt;&gt;&gt; 32));         return result       }     }

2.3 IntWritable

IntWritable实现了WritableComparable。

package org.apache.hadoop.io;import java.io.DataInput;import java.io.DataOutput;import java.io.IOException;import org.apache.hadoop.classification.InterfaceAudience;import org.apache.hadoop.classification.InterfaceStability;@InterfaceAudience.Public@InterfaceStability.Stablepublic class IntWritable implements WritableComparable<IntWritable> {  private int value;  public IntWritable() {}  public IntWritable(int value) { set(value); }  /** Set the value of this IntWritable. */  public void set(int value) { this.value = value; }  /** Return the value of this IntWritable. */  public int get() { return value; }  @Override  public void readFields(DataInput in) throws IOException {    value = in.readInt();  }  @Override  public void write(DataOutput out) throws IOException {    out.writeInt(value);  }  /** Returns true iff <code>o</code> is a IntWritable with the same value. */  @Override  public boolean equals(Object o) {    if (!(o instanceof IntWritable))      return false;    IntWritable other = (IntWritable)o;    return this.value == other.value;  }  @Override  public int hashCode() {    return value;  }  /** 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));  }  @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());  }}