makala 发表于 2016-12-9 06:16:06

Hadoop源代码分析——io.*(一)

  背景知识:
  Hadoop类、接口的标识:
  Hadoop的类、接口文件都要引入两个类InterfaceAudience;InterfaceStability;InterfaceAudience用于标   记该类文件可以被访问的权限。熟悉的有public、private。LimitedPrivate 只能在归属的架构中例如HDFS、HBase中被引用。InterfaceStability用于标记该类文件相对于Hadoop版本升级的稳定性。Stable:只有在主版本升级时可能不兼容。Evolving: 在子版本升级时可能不兼容。Unstable:最不稳定的,兼容性在任何版本下都无法提前预知、保证。
  序列化:将对象转换为字节流的方法。可以用于(1)进程间的通信(2)数据持久性存储。
  interface Writable
  Writable是对Java IO中的DataOutput、DataInput的封装,因此实现实现Writable接口对数据进行序列化。
  Hadoop中的数据类型、包括自定以的数据类型均要作为key、value传输、写入HDFS,因此都要实现Writable。这也是Hadoop不采用Java原始数据类型的原因。
  Writable定义了
  void write(DataOutput out) throws IOException;
  void readFields(DataInput in) throws IOExceptio;
  二者用来读、写字段。
  interface WritableComparable<T>
  继承了Writable, Comparable<T>。
  Map-Reduce框架中作为key的数据类型需要实现该接口。可以自定义某一数据类型同类之间比较方法以及生成该类型数据hashCode方法。
  参考陆驾恒的《Hadoop实战》中表格:
        JAVA基本类型     Writable中的类型        序列化后字节数             boolean      BooleanWritalbe                 1                byte         ByteWritable                 1                 int          IntWritable                 4          VIntWritable                1-5               float        FloatWritable                 4               long        LongWritable                 8        VLongWritalbe                1-9              double       DoubleWritable                 8  以下是官方编写compareTo方法,可以比较int大小this.int < int 返回-1;
  public int compareTo(MyWritableComparable o) {
  int thisValue = this.value;
  int thatValue = o.value;
  return (thisValue < thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
  }
  此外,BinaryComparable类实现了二进制数组的比较。
  通过以上的介绍,我们可以通过实现Writable、WritalbeComparable接口来实现自己的数据类型。
页: [1]
查看完整版本: Hadoop源代码分析——io.*(一)