设为首页 收藏本站
查看: 1097|回复: 0

[经验分享] Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

[复制链接]

尚未签到

发表于 2015-7-12 09:10:33 | 显示全部楼层 |阅读模式
    酒,是个好东西,前提要适量。今天参加了公司的年会,主题就是吃、喝、吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑海,有郁闷抓狂的,有出成果喜极而涕的,有不知前途在哪儿的迷茫与不安……总的来说,近一年来,不白活,不虚度,感触良多,不是一言两语能说得清道的明的,有时间可以做个总结,下面还是言归正传谈技术吧。
         上篇在了解了Hadoop的目录和源码结构后,说好的要啃源码的,那就得啃。也感谢一直以来关注我、支持我的网友,您的关注一直都是我默默前行的动力,也是我在这个行业摸打滚爬的精神食粮^_^
    这里,我们主要对于org.apache.hadoop.conf和org.apache.hadoop.io包的部分进行一个解读,主要包含了hadoop的资源配置类Configuration、hadoop的序列化机制、Writable的地位与继承实现关系、常用类解析。
  
    一、Hadoop资源配置Configuration
    Hadoop没有使用java.util.Properties管理配置文件,其使用了一套独有的配置文件管理系统,并提供自己的API,即使用org.apache.hadoop.conf.Configuration处理配置信息。
    通过org.apache.io.conf包我们可以发现主要包含以下几个接口和类:
  
    Configurable:接口
    方法:setConf()、getConf()
  
    Configured:实现了Configurable的类
    方法:除了实现了Configurable接口中的方法,还有构造函数、用于配置Configuration参数
  
    Configuration:
    Configuration类用来设定资源文件。资源文件是包含键值对的XML数据,其可以是字符串或是路径。如果是字符串,将会根据字符串代表的文件名到classpath下找,如果是路径,则会直接到本地文件系统查找。
    Hadoop默认是加载两个资源文件:core-default.xml和core-site.xml
    Configuration参数可以声明为final类型,一旦定义为final类型,后面就无法被更改,例子如下:  




dfs.client.buffer.dir
/tmp/hadoop/dfs/client
true


   主要方法:有添加资源文件addResource、获取属性值get、设置一个键值对set、获取资源文件个数size等。
  
    二、Hadoop序列化机制
    在进程间传递对象对象持久化存储的时候,就不得不提到序列化以及反序列化,就需要序列化对象成字节流,反之当要将接收到或从磁盘读取的字节流转换为对象,就要进行反序列化。
    序列化:把对象转换为字节序列的过程
    反序列化:把字节序列恢复为对象的过程
    下面是传统序列化和反序列化的代码示例:
    MyObject(用于序列化和反序列化的类对象):



public class MyObject  implements Serializable{
private static final long serialVersionUID = -5809782578272943999L;
public String name ;
private int age;
public String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}

  测试序列化和反序列化代码:



public class MySerializableTest {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
SerializeObject();
MyObject object = Deserialize();
System.out.println("name:" + object.getName() + "\tage:" + object.getAge() + "\tsex:" + object.getSex());
}
private static MyObject Deserialize() throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File("/usr/local/hadoop-0.20.2/serialize.txt")));
MyObject object = (MyObject) oi.readObject();
System.out.println("反序列化成功");
return object;
}
private static void SerializeObject() throws FileNotFoundException, IOException {
MyObject object = new MyObject();
object.setName("Jackie");
object.setAge(25);
object.setSex("male");
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("/usr/local/hadoop-0.20.2/serialize.txt")));
oo.writeObject(object);
System.out.println("序列化成功");
oo.close();
}
}

  最终控制台打印信息:



序列化成功
反序列化成功
name:Jackieage:25sex:male

  注意:一定要在要序列化和反序列化的类上实现标记接口Serializable,否则会报错。
  
    当然,这不是我们要将的Hadoop的序列化机制,深入研究传统的序列化机制,就会发现这种Java序列化机制有自己的缺陷比如计算开销大、序列化的结果占用空间大等。作为一个分布式集群的代名词,这种缺点是不可饶恕的,在每个节点之间进行RPC通讯时当遇到不可想象的序列化后的对象占用空间,这是一种灾难。所以,Hadoop编写实现了自己的序列化机制。
  
    三、Writable的家族体系
    Hadoop的序列化要从这个Writable接口说起。
    Writable接口,即org.apache.hadoop.io.Writable接口,整个Hadoop的所有可序列化的对象接口都必须实现Writable接口,该接口的方法很简单,与传统的序列化类神似。一个是write方法,用于将对象写入字节流,一个是readFields方法,用于将字节流读出解析成对象。
    代码示例:



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;
}
}

  Writable的家族很庞大,主要成员涵盖在下面的一幅图中:  
DSC0000.jpg
  
    四、常见类举例
  BytesWritable

  该类实现了WritableComparable、Writable、Comparable。其用于一串字节序列。

  其主要方法除了readFields(DataInput in)、write(DataOutput out)外,还有equals(Object right_obj)、getSize()这样的方法。


  FloatWritable

  该类实现了WritableComparable、Writable、Comparable。用于Float类型的序列化。

  其主要方法有compareTo(Object o)、readFields(DataInput in)、write(DataOutput out)等。


  IOUtils

  该类是I/O操作类。

  主要方法有忽略异常关闭closeable对象cleanup()方法、忽略异常关闭流closeStream()方法、拷贝流copyBytes()方法、循环读取字节流长度readFully()方法等。


  MapFile

  MapFile是一个Map集合,包含两个文件:数据文件(map中的键值对)、索引文件

  索引文件会一次性完全读进内存,所以,键的实现需要尽可能小。

  Map文件是通过有序的添加entries构成的,为维持这么个大数据及,通过在一个有序列表中拷贝先前版本进行更新,并得到最新版本的数据文件。


  Text

  该类存储采用UTF-8编码的文本,其提供了在字节流层面的序列/反序列文本、比较文本的方法。另外其还提供了翻转字符串的方法。

  主要方法有:charAt、clear、decode、encode、find、readFields、write等


  SequenceFiles

  SequenceFiles是由二进制键值对构成的平面文件。

  SequenceFile文件有三个写入类基于SequenceFile.CompressionType压缩键值对

  1.Writer:不压缩

  2.RecordCompressWriter:记录压缩,只压缩value

  3.BlockCompressWriter:块压缩,压缩key和value


  WritableFactory

  该类可以用来创建Writable对象


    对于Hadoop等大数据技术有兴趣的欢迎加群413471695交流讨论^_^
    本文链接:《Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable》
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85670-1-1.html 上篇帖子: hadoop Hadoop Availability (HA)总结 下篇帖子: hadoop-0.20.1-examples.jar wordcount 例子运行出现的问题记录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表