序列化

1、什么是序列化?
将结构化对象转换成字节流以便于进行网络传输或写入持久存储的过程。
2、什么是反序列化?
将字节流转换为一系列结构化对象的过程。
序列化用途

1、作为一种持久化格式。 
2、作为一种通信的数据格式。 

3、作为一种数据拷贝、克隆机制。

Java序列化和反序列化

1、创建一个对象实现了Serializable 
2、序列化    :ObjectOutputStream.writeObject(序列化对象) 
      反序列化:ObjectInputStream .readObject()返回序列化对象 
具体实现,可参考如下文章: 

http://blog.csdn.net/scgaliguodong123_/article/details/45938555

为什么Hadoop不直接使用java序列化?

Hadoop的序列化机制与Java的序列化机制不同,它将对象序列化到流中,
值得一提的是java的序列化机制是不断的创建对象,

但在hadoop的序列化机制中,用户可以复用对象,这样就减少了java对象的分配和回收,提高了应用效率。

Hadoop序列化

Hadoop的序列化不采用java的序列化,而是实现了自己的序列化机制。 

Hadoop通过Writable接口实现的序列化机制,不过没有提供比较功能,所以和java中的Comparable接口合并,提供一个接口WritableComparable。(自定义比较)

Writable接口提供两个方法(write和readFields)。

package org.apache.hadoop.io;public interface Writable {  
   void write(DataOutput out) throws IOException;  
   void readFields(DataInput in) throws IOException;
}
xxxxxxxxxx
4
 
1
package org.apache.hadoop.io;public interface Writable {  
2
    void write(DataOutput out) throws IOException;  
3
    void readFields(DataInput in) throws IOException;
4
}

需要进行比较的话,要实现WritableComparable接口。

public interface WritableComparable<T> extends Writable, Comparable<T>{}
xxxxxxxxxx
1
 
1
public interface WritableComparable<T> extends Writable, Comparable<T>{}

比如mapreduce中需要对key值进行相应的排序。可参考下面的例子: 

http://blog.csdn.net/scgaliguodong123_/article/details/46010947

Hadoop提供了几个重要的序列化接口与实现类:

外部集合的比较器

WritableComparator 实现了 RawComparator<T> 继承了 extends Comparator<T>

package org.apache.hadoop.io;public interface RawComparator<T> extends Comparator<T> {
 public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);
}public class WritableComparator implements RawComparator {
 private final Class<? extends WritableComparable> keyClass;  private final WritableComparable key1;  private final WritableComparable key2;
}
xxxxxxxxxx
5
 
1
package org.apache.hadoop.io;public interface RawComparator<T> extends Comparator<T> {
2
  public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2);
3
}public class WritableComparator implements RawComparator {
4
  private final Class<? extends WritableComparable> keyClass;  private final WritableComparable key1;  private final WritableComparable key2;
5
}


实现了WritableComparable接口的类(自定义比较)

org.apache.hadoop.io 接口WritableComparable<T>
父接口
Comparable<T>, Writable 基础实现类
BooleanWritable, ByteWritable, ShortWritable,IntWritable,
VIntWritable,LongWritable, VLongWritable , FloatWritable, DoubleWritable高级实现类
MD5Hash, NullWritable,Text, BytesWritable,ObjectWritable,GenericWritable
xxxxxxxxxx
6
 
1
org.apache.hadoop.io 接口WritableComparable<T>
2
父接口
3
Comparable<T>, Writable 基础实现类
4
BooleanWritable, ByteWritable, ShortWritable,IntWritable,
5
VIntWritable,LongWritable, VLongWritable , FloatWritable, DoubleWritable高级实现类
6
MD5Hash, NullWritable,Text, BytesWritable,ObjectWritable,GenericWritable

仅实现了Writable接口的类

org.apache.hadoop.io Interface(接口) WritableAll Known Subinterfaces(子接口):
Counter, CounterGroup, CounterGroupBase<T>, InputSplit, InputSplitWithLocationInfo, WritableComparable<T>

仅实现了Writable接口的类
数组:ArrayWritable、TwoDArrayWritable映射:AbstractMapWritable、MapWritable、SortedMapWritable

x
 
1
org.apache.hadoop.io Interface(接口) WritableAll Known Subinterfaces(子接口): 
2
Counter, CounterGroup, CounterGroupBase<T>, InputSplit, InputSplitWithLocationInfo, WritableComparable<T> 
3

4
仅实现了Writable接口的类
5
数组:ArrayWritable、TwoDArrayWritable映射:AbstractMapWritable、MapWritable、SortedMapWritable

自定义Writable

1、实现WritableComparable接口 
2、实现相应的接口方法

A. write(dos)             //将对象转换为字节流并写入到输出流out中。

B. readFileds()     //从输入流in中读取字节流并发序列化为对象。

C. compareTo(o) //将this对象和对象o进行比较。

可参考下面的例子,自定义NewK2类: 
http://blog.csdn.net/scgaliguodong123_/article/details/46010947

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public static void main(String[] args) throws IOException {        
        Student student = new Student("liguodong"22"男");
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("g:/liguodong.txt")));
        DataOutputStream dos = new DataOutputStream(bos);        
        student.write(dos);        
        dos.flush();        
        dos.close();        
        bos.close();        
         
        Student student2 = new Student();
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("g:/liguodong.txt")));
        DataInputStream dis = new DataInputStream(bis);        
        student2.readFields(dis);
        System.out.println("name="+student2.getName()
                +",age="+student2.getAge()+",sex="+student2.getSex());// 打印:name=liguodong,age=22,sex=男
}
  
// 省略
//Hadoop序列化机制及实例 - 琴弦上、漫步 - CSDN博客
//http://blog.csdn.net/scgaliguodong123_/article/details/46385761#t3

Hadoop序列化优势:

1、紧凑:Hadoop中最稀缺的资源是宽带,所以紧凑的序列化机制可以充分的利用宽带。 
2、快速:通信时大量使用序列化机制,因此,需要减少序列化和反序列化的开销。 
3、可扩展:随着通信协议的升级而可升级。 
4、互操作:支持不同开发语言的通信。 
Hadoop1.x 序列化仅满足了紧凑和快速的特点。

Hadoop序列化的作用

序列化在分布式环境的两大作用:进程间通信,永久存储。 
Hadoop节点间通信。

序列化框架

Apache Avro

1、丰富数据结构类型 
2、快速可压缩的二进制数据形式 
3、存储持久数据的文件容器 
4、远程过程调用RPC 
5、简单的动态语言结合功能,Avro和动态语言结合后,读写数据文件和使用RPC协议都不需要生成代码,而代码生成作为一种可选的优化,只值得在静态类型语言中实现。

Facebook Thrift 

1、是一种可伸缩的跨语言服务的发展软件框架。 
2、它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C++,C#,.Java,PythonPHP和Ruby结合。 
3、允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

Google Protocolbuffer  

PB是Google开源的一种轻量级的结构化数据存储格式,可以用于结构化数据的序 
列化与反序列化,很适合做数据存储RPC数据交换格式。 

优点: 
与 XML相比,它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。

它有一个非常棒的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠”老”数据格式的程序就可以对数据结构进行升级。这样您的程序就可以不必担心因为消息结构的改变而造成的大规模的代码重构或者迁移的问题。因为添加新的消息中的 field 并不会引起已经发布的程序的任何改变。

Protocolbuffer语义更清晰无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。使用 Protobuf 无需学习复杂的文档对象模型,Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf 比其他的技术更加有吸引力。

不足: 
Protbuf 与 XML 相比也有不足之处。它功能简单,无法用来表示复杂的概念

由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,由于 XML 具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上 Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容。

Hadoop2.X用到的Protocolbuffer 
hadoop-2.6.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/proto


参考

Hadoop序列化机制及实例 - 琴弦上、漫步 - CSDN博客

http://blog.csdn.net/scgaliguodong123_/article/details/46385761#t3

hadoop深入研究:(十三)——序列化框架 - 独自登高楼 望断天涯路 - CSDN博客

http://blog.csdn.net/lastsweetop/article/details/9376495

Hadoop序列化机制及实例的更多相关文章

  1. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  2. hadoop序列化机制与java序列化机制对比

    1.采用的方法: java序列化机制采用的ObjectOutputStream 对象上调用writeObject() 方法: Hadoop 序列化机制调用对象的write() 方法,带一个DataOu ...

  3. 大数据框架hadoop的序列化机制

    Java内建序列化机制 在Windows系统上序列化的Java对象,可以在UNIX系统上被重建出来,不需要担心不同机器上的数据表示方法,也不需要担心字节排列次序. 在Java中,使一个类的实例可被序列 ...

  4. Hadoop序列化

      遗留问题: Hadoop序列化可以复用对象,是在哪里复用的? 介绍Hadoop序列化机制 Hadoop序列化机制详解 Hadoop序列化的核心 Hadoop序列化的比较接口 ObjectWrita ...

  5. Zookeeper 序列化机制

    一.到底在哪些地方需要使用序列化技术呢? 二.Zookeeper(分布式协调服务组件+存储系统) Java 序列化机制 Hadoop序列化机制 Zookeeper序列化机制 一.到底在哪些地方需要使用 ...

  6. 1 weekend110的复习 + hadoop中的序列化机制 + 流量求和mr程序开发

    以上是,weekend110的yarn的job提交流程源码分析的复习总结 下面呢,来讲weekend110的hadoop中的序列化机制 1363157985066      13726230503  ...

  7. 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序

    一:序列化概念 序列化(Serialization)是指把结构化对象转化为字节流.反序列化(Deserialization)是序列化的逆过程.即把字节流转回结构化对象.Java序列化(java.io. ...

  8. Hadoop学习笔记—3.Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  9. Hadoop序列化与Java序列化

    序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输 反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象. 1.JDK的序列化 只要实现了serial ...

随机推荐

  1. MySQL事务之-2

    在上一篇中我们提到了MySQL的事务特性,这一片主要讲述事务的实现. 事务的隔离性由锁来实现.原子性,一致性,持久性通过数据库的redo和undo log来实现. redo恢复提交事务修改页的操作,而 ...

  2. 20162326 Exp1《网络对抗技术》 PC平台逆向破解

    1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程 ...

  3. POJ 1840 Eqs(乱搞)题解

    思路:这题好像以前有类似的讲过,我们把等式移一下,变成 -(a1*x1^3 + a2*x2^3)== a3*x3^3 + a4*x4^3 + a5*x5^3,那么我们只要先预处理求出左边的答案,然后再 ...

  4. jsp页面中jstl标签详解[转]

    JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...

  5. npm package.json中的dependencies和devDependencies的区别

    转载:http://www.cnblogs.com/jes_shaw/p/4497836.html 一个node package有两种依赖,一种是dependencies一种是devDependenc ...

  6. 【Android】冷门常用 ADB

    清除应用缓存adb shell pm clear 包名 获取手机中安装的包名,加上部分包名可以做筛选 adb shell pm list package adb shell pm list packa ...

  7. III USP Freshmen ContestH. MaratonIME gets candies

    这题挺有意思的,刚开始不会这交互题,模仿着做了一题就会了,蛮简单 的 这题我用2分,结果wa了,想了一下发现,1到1e9二分50次完全不够用啊,那就转换一下思维,先求出在10^n~10^(n+1)的n ...

  8. PHP:第六章——正则表达式的基本概念

    <?php header("Content-Type:text/html;charset=utf-8"); //正则表达式的基本概念: //宽松匹配和严格匹配: //常见的匹 ...

  9. SPOJ VLATTICE Visible Lattice Points 莫比乌斯反演 难度:3

    http://www.spoj.com/problems/VLATTICE/ 明显,当gcd(x,y,z)=k,k!=1时,(x,y,z)被(x/k,y/k,z/k)遮挡,所以这道题要求的是gcd(x ...

  10. Django 之 Ajax

    此次主要是做省市区的三级联动. 环境:django 1.10 1. urls.py # coding:utf-8 from django.conf.urls import url import vie ...