Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
酒,是个好东西,前提要适量。今天参加了公司的年会,主题就是吃、喝、吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑海,有郁闷抓狂的,有出成果喜极而涕的,有不知前途在哪儿的迷茫与不安……总的来说,近一年来,不白活,不虚度,感触良多,不是一言两语能说得清道的明的,有时间可以做个总结,下面还是言归正传谈技术吧。
上篇在了解了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的更多相关文章
- Hadoop阅读笔记(四)——一幅图看透MapReduce机制
时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...
- Hadoop阅读笔记(七)——代理模式
关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...
- Hadoop阅读笔记(一)——强大的MapReduce
前言:来园子已经有8个月了,当初入园凭着满腔热血和一脑门子冲动,给自己起了个响亮的旗号“大数据 小世界”,顿时有了种世界都是我的,世界都在我手中的赶脚.可是......时光飞逝,岁月如梭~~~随手一翻 ...
- Hadoop阅读笔记(五)——重返Hadoop目录结构
常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...
- Hadoop阅读笔记(三)——深入MapReduce排序和单表连接
继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...
- Hadoop阅读笔记(二)——利用MapReduce求平均数和去重
前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...
- hadoop学习笔记--找到执行hadoop的入口
参与个hadoop项目,之前没搞过,赶紧学习: 照葫芦画瓢,得到代码是hdfs2local.sh脚本和LiaoNingFilter.jar包,迫不及待用jd-gui打开jar包,搜索到main(在MA ...
- 云时代架构阅读笔记六——Java内存模型详解(二)
承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...
- Hadoop学习笔记(1) 初识Hadoop
1. Hadoop提供了一个可靠的共享存储和分析系统.HDFS实现存储,而MapReduce实现分析处理,这两部分是Hadoop的核心. 2. MapReduce是一个批量查询处理器,并且它能够在合理 ...
随机推荐
- day10---异步I/O,gevent协程
协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...
- Java中HashMap等的实现要点浅析
@南柯梦博客中的系列文章对Jdk中常用容器类ArrayList.LinkedList.HashMap.HashSet等的实现原理以代码注释的方式给予了说明(详见http://www.cnblogs.c ...
- .NET开发的大型网站列表、各大公司.NET职位精选,C#王者归来
简洁.优雅.高效的C#语言,神一样的C#创始人Anders Hejlsberg,async/await编译器级异步语法,N年前就有的lambda表达式,.NET Native媲美C++的原生编译性能, ...
- Xamarin.Android之MvvmCross
欢迎大家加入以下开源社区 Xamarin-Cn:https://github.com/Xamarin-Cn Mvvmcross-Cn:https://github.com/Mvvmcross-Cn ...
- 如何参与一个 GitHub 开源项目?
最近一年开源项目特别的热,很多技术大会或论坛都以开源项目作为主题进行探讨,可见这是一种趋势.而Github作为开源项目的著名托管地,可谓无 人不知,越来越多的个人和公司纷纷加入到Github的大家族里 ...
- 我的ORM之示例项目
我的ORM索引 示例项目 code.taobao.org/svn/MyMvcApp/ 1. 编译 MyTool ,DbEnt, WebApp, 安装JRE. 2. 配置 Web.config 数据库字 ...
- alwaysOn为什么不支持分布式事务
Alwayson是微软从SQL2012开始引入的一种高可用和高性能架构,它既可以实现故障转移,同时又能实现查询分离,是当前SQL server的所有架构中最优秀的一种. 因此,一般我们都会推荐使用Al ...
- Unity3D热更新全书-PageZero
由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...
- 科蓝软件急招前端开发、PHP、.NET工程师
职位:前端开发 工作年限:不限 学历要求:大专 招聘人数:2 专业:不限 薪酬:面议 工作地点:浙江嘉兴.北京 岗位职责: 1.负责公司项目的UI设计: 2.负责将UI静态化 ...
- 在Mongoose中使用嵌套的populate处理数据
假设有如下mongodb的schema定义: drawApply = new Schema({ salesId: { type: Schema.ObjectId, ref: 'sales' }, mo ...