文档章节

hadoop AbstractMapWritable及其实现类

tuzibuluo
 tuzibuluo
发布于 2014/03/18 10:49
字数 982
阅读 465
收藏 0

     AbstractMapWritable作为抽象的Map容器Writable类型,主要是为其实现类MapWritable和SortedMapWritable提供出一套索引表的结构,如下:

Map<Class, Byte> classToIdMap = new ConcurrentHashMap<Class, Byte>()     //id到Class的映射表
Map<Byte, Class> idToClassMap = new ConcurrentHashMap<Byte, Class>(),   //class到Id的映射表

索引表需要添加新的class对象和Id映射关系,势必需要一个新的Id变量,class对象则作为方法形参,如下

 private volatile byte newClasses = 0;

有了上面的数据结构,则需要增加一些数据的操作方法,既然AbstractMapWritable基本的数据结构是关于索引表的,自然的会有索引的添加

private synchronized void addToMap(Class clazz, byte id) {
  //主要实现功能为对索引id通过两个索引表操作是否存在已存在,索引Id存在但不为形参id则抛异常,否则加入索引信息
}
protected synchronized void addToMap(Class clazz) {
   //不存在索引id,且当前索引变量newClasses<127则自动加入索引信息 
  if (classToIdMap.containsKey(clazz)) {
      return;
    }
    if (newClasses + 1 > Byte.MAX_VALUE) {
      throw new IndexOutOfBoundsException("adding an additional class would" +
      " exceed the maximum number allowed");
    }
    byte id = ++newClasses;
    addToMap(clazz, id);
}

 AbstractMapWritable提供了一个受保护的构造函数

  protected AbstractMapWritable() {
    this.conf = new AtomicReference<Configuration>();
    
    //添加基础序列化类型的索引信息,索引表能表示的范围只有-127~128种类型
    addToMap(ArrayWritable.class,
        Byte.valueOf(Integer.valueOf(-127).byteValue())); 
    addToMap(BooleanWritable.class,
        Byte.valueOf(Integer.valueOf(-126).byteValue()));
    addToMap(BytesWritable.class,
        Byte.valueOf(Integer.valueOf(-125).byteValue()));
    addToMap(FloatWritable.class,
        Byte.valueOf(Integer.valueOf(-124).byteValue()));
    addToMap(IntWritable.class,
        Byte.valueOf(Integer.valueOf(-123).byteValue()));
    addToMap(LongWritable.class,
        Byte.valueOf(Integer.valueOf(-122).byteValue()));
    addToMap(MapWritable.class,
        Byte.valueOf(Integer.valueOf(-121).byteValue()));
    addToMap(MD5Hash.class,
        Byte.valueOf(Integer.valueOf(-120).byteValue()));
    addToMap(NullWritable.class,
        Byte.valueOf(Integer.valueOf(-119).byteValue()));
    addToMap(ObjectWritable.class,
        Byte.valueOf(Integer.valueOf(-118).byteValue()));
    addToMap(SortedMapWritable.class,
        Byte.valueOf(Integer.valueOf(-117).byteValue()));
    addToMap(Text.class,
        Byte.valueOf(Integer.valueOf(-116).byteValue()));
    addToMap(TwoDArrayWritable.class,
        Byte.valueOf(Integer.valueOf(-115).byteValue()));
    
    // UTF8 is deprecated so we don't support it

    addToMap(VIntWritable.class,
        Byte.valueOf(Integer.valueOf(-114).byteValue()));
    addToMap(VLongWritable.class,
        Byte.valueOf(Integer.valueOf(-113).byteValue()));
}

紧接着的是序列化和反序列化方法

序列化:将索引信息写流中

//序列化方法首先写入的是当前索引变量newClasses,然后依次从索引Id范围[1,newClasss]依次写入索引Id+类名的组合
public void write(DataOutput out) throws IOException {
    
    // First write out the size of the class table and any classes that are
    // "unknown" classes
    //写入索引ID
    out.writeByte(newClasses);
    /*
    **不明白为什么只是写入部分[1~newClasses]的索引信息,而非[-127~newClasses的索引信息],
    **猜想可能与子类覆盖其受保护的构造函数有关,因为newClasses默认初始为0
    **/
    for (byte i = 1; i <= newClasses; i++) {
      out.writeByte(i);
      out.writeUTF(getClass(i).getName());
    }
  }

反序列化:从流中构造出索引信息

  //主要是根据序列化的结构从流中构造索引信息
  public void readFields(DataInput in) throws IOException {
    
    // Get the number of "unknown" classes
    
    newClasses = in.readByte();
    
    // Then read in the class names and add them to our tables
    
    for (int i = 0; i < newClasses; i++) {
      byte id = in.readByte();
      String className = in.readUTF();
      try {
      //索引信息构造
        addToMap(Class.forName(className), id);
        
      } catch (ClassNotFoundException e) {
        throw new IOException("can't find class: " + className + " because "+
            e.getMessage());
      }
    }
  }

AbstractMapWritable作为MapWritable抽象类并没有涉及到Map<Wirtable,Writable>的键值对操作,而是从抽象层抽象出索引表,其实现类MapWritable和SortedMapWritable则是新增了Map<Wirtable,Writable>变量,不同的之处在于SortedMapWritable是实现了排序了的TreeMap,自身已具有排序功能。

 //MapWritable构造函数
 public MapWritable() {
    super();
    this.instance = new HashMap<Writable, Writable>();
  }
  //SortedMapWritable构造函数
  public SortedMapWritable() {
    super();
    this.instance = new TreeMap<WritableComparable, Writable>();
  }

对于新增的成员Map<Wirtable,Writable>自然需要具备一些方法,基本上跟java的map(这里需要维护索引表)方法无异,但对于序列化和反序列化则是在其抽象类的基础上扩展,具体如下

序列化:先调用AbstractMapWritable的序列化方法,在对Map<Wirtable,Writable>的容量序列化,接着对key和value一一序列化

//MapWritable的序列化方法
public void write(DataOutput out) throws IOException {
    super.write(out);
    
    // Write out the number of entries in the map
    
    out.writeInt(instance.size());

    // Then write out each key/value pair
    
    for (Map.Entry<Writable, Writable> e: instance.entrySet()) {
      out.writeByte(getId(e.getKey().getClass()));
      e.getKey().write(out);
      out.writeByte(getId(e.getValue().getClass()));
      e.getValue().write(out);
    }
  }

反序列化:则按照上诉的结构从流中构造出索引表和Writable对象。





© 著作权归作者所有

tuzibuluo
粉丝 3
博文 14
码字总数 9603
作品 0
香港
私信 提问
如何在 Hadoop 2.2.0 环境下使用 Spark 2.2.x

如果下面文章格式或图片不清晰,请参见原文:https://www.iteblog.com/archives/2305.html 或直接点击下面 阅读原文 即可进入。 到 Github 下载支持 Hadoop 2.5 及其之前版本的 Spark 2.2.1 ...

b6ecl1k7bs8o
2017/12/14
0
0
如何在 Hadoop 2.2.0 环境下使用 Spark 2.2.x

Apache Spark 2.2.0 于今年7月份正式发布, 这个版本是 Structured Streaming 的一个重要里程碑,因为其可以正式在生产环境中使用,实验标签(experimental tag)已经被移除; CBO (Cost-Ba...

Spark
2017/12/13
0
0
Hadoop家族学习路线图

权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增...

_Mr_Computer_
2016/07/13
0
0
Hadoop序列化&Java序列化

Java序列化机制将对象装换为连续的byte数据, 这些数据可以在以后还原(反序列化)成原来的对象 Java中, 要想一个类的实例可被序列化, 该类须实现Serializable接口. Serializable接口是一个标志...

wall--e
2016/04/13
64
0
Hadoop家族学习路线图(转)

Hadoop家族学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN,...

冯辉
2016/11/03
54
0

没有更多内容

加载失败,请刷新页面

加载更多

iStatistica Pro for Mac(系统监控工具) v1.1.2

iStatistica Mac破解版推荐给大家!iStatistica Pro Mac是一款功能强大的系统监控工具,实时监控CPU,内存,网络,磁盘卡,帮你轻松删除不需要的文件和文件夹,释放电脑内存,提升运行速度。...

云不若
18分钟前
4
0
Vim和Ctags提示和技巧[关闭]

我刚刚使用我的Vim(或者更确切地说是gVim)安装了Ctags (以帮助进行C ++开发),并希望找到您最喜欢的命令,宏,快捷方式,以及随之而来的提示...... 分享你最好的武器库。 在Vim开发中你会...

技术盛宴
21分钟前
6
0
tensorlfow安装

系统环境 nv-jetson-nano-sd-card-image-r32.3.1.zip 1 基本工具安装 默认安装了python 3.6.8,需要安装如下基本软件 sudo apt updatesudo apt install curlcurl https://bootstrap.pyp...

JosiahMg
21分钟前
3
0
彻底修改maven项目工程的名称

1

观海562
40分钟前
5
0
整数反转(力扣)

整数反转 一、题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 ...

迪迪迪王
50分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部