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

[经验分享] Hadoop深入学习:MapReduce的序列化

[复制链接]

尚未签到

发表于 2016-12-9 10:23:43 | 显示全部楼层 |阅读模式
在学习MapReduce编程模型接口的五个组件之前,我们先来看一下MapReduce的序列化。
       那么什么是序列化呢?
       序列化就是讲一个对象编码成一个字节流;相反,从字节流中重新构建对象就叫做反序列化。序列化主要有三种用途:
       ●持久化:将内存中的对象经序列化后保存到磁盘上;
       ●作为通信的数据传输格式:将一个机器上的内存中的对象经序列化后传输到其他机器上,或在相同机器上的不同进程之间的数据通信;
       ●作为copy、clone机制:将对象序列化到内存中,然后通过反序列化,可以得到一个已存在的对象的copy。
       在分布式系统中,主要使用序列化的前两种功能,数据持久化和通信数字格式。
       MapReduce为什么要专门再开发出自己的序列化(Writable),而不用java原有的序列化(Serializable)?在本节中我们将会找到答案。
       我们先来看一下Java内置的序列化机制,该序列化机制非常简单,只需要将要序列化的对象的类继承java.io.Serializable接口就行了。java.io.Serializable只是一个标志性的接口,不具有任何成员函数:
public interface Serializable {
}

       Java的序列化机制非常“聪明”,它会将要序列化的对象的类、类签名、类的所有非暂态和非晶态成员变量的值,以及其所有的父类都要序列化。同时,它还会跟踪要序列化的对象所有可以达到的其他对象内部数据,并描述所有这些对象是如何被链接起来的,即使非常复杂的情况如循环引用的对象,序列化也不会陷入死循环。但是,经Java内置的序列化后的数据的大小太庞大了,不但包括用户想要保存的数据,还包括大量的类相关的附加数据信息,这对需要保存和处理的大规模数据的Hadoop来说,很不合适。另外还有一点,Java的序列化机制不能复用反序列化后的对象。
       对于Hadoop,其序列化机制需要有如下的特征:
       ●紧凑:在Hadoop中,带宽是最稀缺的资源,一个紧凑的序列化机制可以充分利用数据中心的带宽;
       ●快速(性能):在进程间通信会大量使用序列化机制,因此需要尽量减少序列化合反序列化的开销;
       ●可扩展:随着系统发展,系统间通信的协议可能会升级,累的定义也可能会发生改变,序列化机制需要这些升级和变化;
       ●互操作:可以支持不同开发语言间的通信。
       Java内置的序列化机制虽然简单而强大,但是却并不符合上述的要求。但是Hadoop平台中新的序列化机制,就完全符合上述要求吗,答案是否定的,它只符合紧凑和快速的要求,但是缺不符合可扩展和互操作的要求。
       为了支持以上特性,Hadoop引入了org.apache.hadoop.io.Writable接口。Writable机制满足了紧凑和快速的这两个特性,Writable接口不是一个说明性的标志接口,声明如下:
public interface Writable{
/**
* 反序列化操作,从流中读数据,为了效率,尽量复用现有对象
* @param input DataInput流,从该流中读取数据
* @Throws IOException
*/
@Override
public void readFields(DataInput input) throws IOException {
//TODO
}
/**
* 序列化操作,将对象输出到流中
* @param output DataOutput流,序列化后的结果
* @Throws IOException
*/
@Override
public void write(DataOutput output) throws IOException {
//TODO
}
}

         Writable的使用示例代码:
public class ModeEntry implements Writable{
private long key;
private long value;
public ModeEntry(long key,long value){
this.key = key;
this.value = value;
}
/**
* 反序列化操作,从流中读数据,为了效率,尽量复用现有对象
* @param input DataInput流,从该流中读取数据
* @throws IOException
*/
@Override
public void readFields(DataInput input) throws IOException {
this.key = input.readLong();
this.value = input.readLong();
}
/**
* 序列化操作,将对象输出到流中
* @param output DataOutput流,序列化后的结果
* @throws IOException
*/
@Override
public void write(DataOutput output) throws IOException {
output.writeLong(this.key);
output.writeLong(this.value);
}
}


         总的来说,Hadoop的序列化机制的特点是紧凑、高效和可复用反序列化后的对象。另外相比Java内建的序列化机制,序列化后的数据比较少,不会附加大量的类信息和其应用对象及对象的链接信息,在序列化和反序列化的开销上,Hadoop的序列化机制要较Java内建的序列化机制开销要少很多。

运维网声明 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-311853-1-1.html 上篇帖子: hadoop 2.x 的一些改进 下篇帖子: web工程调用hadoop集群1.2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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