Mapreduce之序列化框架(转自http://blog.csdn.net/lastsweetop/article/details/9376495)
框架简介
Serializer
- public interface Serializer <T> {
- void open(java.io.OutputStream outputStream) throws java.io.IOException;
- void serialize(T t) throws java.io.IOException;
- void close() throws java.io.IOException;
- }
Deserializer
- public interface Deserializer <T> {
- void open(java.io.InputStream inputStream) throws java.io.IOException;
- T deserialize(T t) throws java.io.IOException;
- void close() throws java.io.IOException;
- }
Serialization
- public interface Serialization <T> {
- boolean accept(java.lang.Class<?> aClass);
- org.apache.hadoop.io.serializer.Serializer<T> getSerializer(java.lang.Class<T> tClass);
- org.apache.hadoop.io.serializer.Deserializer<T> getDeserializer(java.lang.Class<T> tClass);
- }
WritableSerialization
- <pre style="word-wrap: break-word; white-space: pre-wrap; ">public class WritableSerialization extends Configured
- implements Serialization<Writable> {
- static class WritableDeserializer extends Configured
- implements Deserializer<Writable> {
- private Class<?> writableClass;
- private DataInputStream dataIn;
- public WritableDeserializer(Configuration conf, Class<?> c) {
- setConf(conf);
- this.writableClass = c;
- }
- public void open(InputStream in) {
- if (in instanceof DataInputStream) {
- dataIn = (DataInputStream) in;
- } else {
- dataIn = new DataInputStream(in);
- }
- }
- public Writable deserialize(Writable w) throws IOException {
- Writable writable;
- if (w == null) {
- writable
- = (Writable) ReflectionUtils.newInstance(writableClass, getConf());
- } else {
- writable = w;
- }
- writable.readFields(dataIn);
- return writable;
- }
- public void close() throws IOException {
- dataIn.close();
- }
- }
- static class WritableSerializer implements Serializer<Writable> {
- private DataOutputStream dataOut;
- public void open(OutputStream out) {
- if (out instanceof DataOutputStream) {
- dataOut = (DataOutputStream) out;
- } else {
- dataOut = new DataOutputStream(out);
- }
- }
- public void serialize(Writable w) throws IOException {
- w.write(dataOut);
- }
- public void close() throws IOException {
- dataOut.close();
- }
- }
- public boolean accept(Class<?> c) {
- return Writable.class.isAssignableFrom(c);
- }
- public Deserializer<Writable> getDeserializer(Class<Writable> c) {
- return new WritableDeserializer(getConf(), c);
- }
- public Serializer<Writable> getSerializer(Class<Writable> c) {
- return new WritableSerializer();
- }
- }</pre>
两个内部静态类分别实现Serializer和Deserializer接口,然后getSerializer和getDeserializer分别实例化WritableSerializer和WritableDeserializer,
SerializationFactory
- public SerializationFactory(Configuration conf) {
- super(conf);
- for (String serializerName : conf.getStrings("io.serializations",
- new String[]{"org.apache.hadoop.io.serializer.WritableSerialization"})) {
- add(conf, serializerName);
- }
- }
可知他是从io.serializations属性指定的实现了Serialization的类,然后再看他是如何知道选哪个Serialization的
- public <T> Serialization<T> getSerialization(Class<T> c) {
- for (Serialization serialization : serializations) {
- if (serialization.accept(c)) {
- return (Serialization<T>) serialization;
- }
- }
- return null;
- }
好吧,就是这么简单,判断一下是否是对应的子类而已。
为什么不使用java序列化
1.java序列化不够灵活,为了更好的控制序列化的整个流程所以使用Writable
2.java序列化不符合序列化的标准,没有做一定的压缩,java序列化首先写类名,然后再是整个类的数据,而且成员对象在序列化中只存引用,成员对象的可以出现的位置很随机,既可以在序列化的对象前,也可以在其后面,这样就对随机访问造成影响,一旦出错,整个后面的序列化就会全部错误,但是
Writable完美的弥补了这一点,因为Writable中每一条纪录间是相互独立的
3.Java序列化每次序列化都要重新创建对象,内存消耗大,而Writable是可以重用的。
序列化IDL
Mapreduce之序列化框架(转自http://blog.csdn.net/lastsweetop/article/details/9376495)的更多相关文章
- 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101
Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...
- http://blog.csdn.net/luoshengyang/article/details/6651971
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6651971 在Android系统中,提供了独特 ...
- http://blog.csdn.net/v_july_v/article/details/6543438
本文转载至: http://blog.csdn.net/v_july_v/article/details/6543438 算法 程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总 ...
- http://blog.csdn.net/baimafujinji/article/details/10931621
书接上文,本文章是该系列的第二篇,按照总纲中给出的框架,本节介绍三个中值定理,包括它们的证明及几何意义.这三个中值定理是高等数学中非常基础的部分,如果读者对于高数的内容已经非常了解,大可跳过此部分.当 ...
- [Android Pro] https://blog.csdn.net/gaugamela/article/details/79143309
原文地址:https://blog.csdn.net/gaugamela/article/details/79143309 最近遇到这样一个问题: 第三方的SDK除了Jar包外,还提供了对应的so文件 ...
- RedHat如何关闭防火墙 : http://blog.csdn.net/chongxin1/article/details/76072758
版本号:RedHat6.5 JDK1.8 Hadoop2.7.3 hadoop 说明:从版本2开始加入了Yarn这个资源管理器,Yarn并不需要单独安装.只要在机器上安装了JDK就可以直接安 ...
- 转-spring-boot 注解配置mybatis+druid(新手上路)-http://blog.csdn.net/sinat_36203615/article/details/53759935
spring-boot 注解配置mybatis+druid(新手上路) 转载 2016年12月20日 10:17:17 标签: sprinb-boot / mybatis / druid 10475 ...
- mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204
前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...
- http://blog.csdn.net/LANGXINLEN/article/details/50421988
GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时候,无意中发现了 @Trinea在GitHub上的一个项目 Android开源项目分类汇总, 由于类容太多了,我没有一个个完整地 ...
随机推荐
- CS6破解
1) 序列号这里为大家生成了两个,可以通过软件验证:1325-0949-2080-9819-3777-32301325-0160-5283-9851-2671-8951 2) 破解补丁安装时会用到,请 ...
- 错误提示: An App ID with identifier "*****" is not avaliable. Please enter a different string.
百度了很多,但大多的解决办法就是 更改BundleID,的确管用,,但是有的情况下,你需要跟同事合作,公用同一个BundleID, 我是这样处理的:工具栏中打开Window—project删除所有工程 ...
- GitLab使用方法
注意只有master权限的用户才可以push到主线master分支上(默认受保护)(当一个新版本的app定版之后,才会提交到master分支上,平时不建议使用该分支),developer没有push到 ...
- php回调函数
1.array_filter($arr, "odd") <?php $arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9); function odd ...
- Windows 下用 gogs 配置局域网 git server
大道曙光 Windows 下用 gogs 配置局域网 git server 最近要用 C# 开发一个新的项目,所以需要在 Windows 局域网环境下构建一个 git server. 在 Window ...
- linux 入门
php php -v ------------------ 阿帕奇 apachectl -v httpd -v ----------------------------- mys ...
- [ROS]3 Linux编程练习
一起做RGB-SLAM(2)实验 第二讲 从图像到点云 http://www.cnblogs.com/gaoxiang12/p/4652478.html exbot@ubuntu:~$ cd Code ...
- javascript设计模式学习之四——单例模式,缓存与对象池
单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...
- jquery对strutrs2 <s:radio>标签的设置和取值
今天郁闷了1小时. 需求是这样的: <s:radio list="#{0:'男',1:'女'}" value="member.sex" id=" ...
- nodejs发起HTTPS请求并获取数据
摘要:在网站中有时候需要跨域请求数据,直接用Ajax无法实现跨域,采用其他方式需要根据不同的浏览器做相应的处理.用Nodejs可以很好的解决这些问题,后台引用HTTPS模块,发送和返回的数据均为JSO ...