酒,是个好东西,前提要适量。今天参加了公司的年会,主题就是吃、喝、吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑海,有郁闷抓狂的,有出成果喜极而涕的,有不知前途在哪儿的迷茫与不安……总的来说,近一年来,不白活,不虚度,感触良多,不是一言两语能说得清道的明的,有时间可以做个总结,下面还是言归正传谈技术吧。

上篇在了解了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类型,后面就无法被更改,例子如下:  

<property>
<name>dfs.client.buffer.dir</name>
<value>/tmp/hadoop/dfs/client</value>
<final>true</final>
</property>

   主要方法:有添加资源文件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:Jackie age:25 sex: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的家族很庞大,主要成员涵盖在下面的一幅图中:  

  

  四、常见类举例

  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. 支付宝                          2. 微信

                      

Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable的更多相关文章

  1. Hadoop阅读笔记(四)——一幅图看透MapReduce机制

    时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...

  2. Hadoop阅读笔记(七)——代理模式

    关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...

  3. Hadoop阅读笔记(一)——强大的MapReduce

    前言:来园子已经有8个月了,当初入园凭着满腔热血和一脑门子冲动,给自己起了个响亮的旗号“大数据 小世界”,顿时有了种世界都是我的,世界都在我手中的赶脚.可是......时光飞逝,岁月如梭~~~随手一翻 ...

  4. Hadoop阅读笔记(五)——重返Hadoop目录结构

    常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...

  5. Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

    继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...

  6. Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

    前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...

  7. hadoop学习笔记--找到执行hadoop的入口

    参与个hadoop项目,之前没搞过,赶紧学习: 照葫芦画瓢,得到代码是hdfs2local.sh脚本和LiaoNingFilter.jar包,迫不及待用jd-gui打开jar包,搜索到main(在MA ...

  8. 云时代架构阅读笔记六——Java内存模型详解(二)

    承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...

  9. Hadoop学习笔记(1) 初识Hadoop

    1. Hadoop提供了一个可靠的共享存储和分析系统.HDFS实现存储,而MapReduce实现分析处理,这两部分是Hadoop的核心. 2. MapReduce是一个批量查询处理器,并且它能够在合理 ...

随机推荐

  1. bzoj 3718

    题意:戳这里 思路:很容易发现对于一个车能否移动到最终的位置只要判断路径中得最大高度与自身高端之和是否>w即可. 那么就可以转化为逆序对得最大数问题..即对于每一辆车,判断有那些最初在他前面,而 ...

  2. 走读openwrt的shell的总结【转】

    原文:http://blog.chinaunix.net/uid-26598889-id-3060543.html ". /etc/diag.sh" 就是将/etc/diag.sh ...

  3. (转)Unity AssetBundle爬坑手记

    转自:http://www.cnblogs.com/ybgame/p/3973177.html 这篇文章从AssetBundle的打包,使用,管理以及内存占用各个方面进行了比较全面的分析,对Asset ...

  4. SubversionEdge 变更绑定地址

    接上一篇,由于VS的项目和SubversionEdge是通过固定的IP地址绑定在一起的,所以这就有个问题:如果由于种种原因,IP地址换了,那么绑定就失效了. 此时,VS项目的各种变更无法提交到Subv ...

  5. 无法将类型为“System.Decimal”的对象强制转换为类型“System.Char[]”。

    在用微软的SSIS操作ORACLE 数据源的时候碰到以下报错信息: [ADO NET Destination [13455]] 错误: 数据插入期间出现异常,从提供程序返回的消息为:无法将类型为&qu ...

  6. highcharts 当Y轴全部没有数据的时候 数据标签显示最下面 而不是居中显示

    yAxis: {min: 0,minRange: 1}

  7. Ember.js之动态创建模型

    本人原文地址发布在:点击这里 What problem did we meet? As ember document suggestion, we may define a model as a st ...

  8. RCP:导航器视图删除操作快捷键失效的解决方案

    导航器视图按下“Delete”的时候,会触发删除节点的操作.如果失效,按以下步骤检查: 1.在要删除的节点上点击右键,确定删除操作是否生效.如果没有生效,则按下列位置 a)检查navigator扩展配 ...

  9. AMD加载器实现笔记(五)

    前几篇文章对AMD规范中的config属性几乎全部支持了,这一节主要是进一步完善.到目前为止我们的加载器还无法处理环形依赖的问题,这一节就是解决环形依赖. 所谓环形依赖,指的是模块A的所有依赖项的依赖 ...

  10. Homework_4 四则运算 - C#版

    题目要求 :http://www.cnblogs.com/gdfhp/p/5311937.html 结对同伴: 姓名:胡仕辉   学号:130201225   博客地址:http://www.cnbl ...