Hadoop序列化机制及实例
序列化
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)。
void write(DataOutput out) throws IOException;
void readFields(DataInput in) throws IOException;
}
xxxxxxxxxx
package org.apache.hadoop.io;public interface Writable {
void write(DataOutput out) throws IOException;
void readFields(DataInput in) throws IOException;
}
需要进行比较的话,要实现WritableComparable接口。
xxxxxxxxxx
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>
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
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;
}
实现了WritableComparable接口的类(自定义比较)
父接口
Comparable<T>, Writable 基础实现类
BooleanWritable, ByteWritable, ShortWritable,IntWritable,
VIntWritable,LongWritable, VLongWritable , FloatWritable, DoubleWritable高级实现类
MD5Hash, NullWritable,Text, BytesWritable,ObjectWritable,GenericWritable
xxxxxxxxxx
org.apache.hadoop.io 接口WritableComparable<T>
父接口
Comparable<T>, Writable 基础实现类
BooleanWritable, ByteWritable, ShortWritable,IntWritable,
VIntWritable,LongWritable, VLongWritable , FloatWritable, DoubleWritable高级实现类
MD5Hash, NullWritable,Text, BytesWritable,ObjectWritable,GenericWritable
仅实现了Writable接口的类
Counter, CounterGroup, CounterGroupBase<T>, InputSplit, InputSplitWithLocationInfo, WritableComparable<T>
仅实现了Writable接口的类
数组:ArrayWritable、TwoDArrayWritable映射:AbstractMapWritable、MapWritable、SortedMapWritable
org.apache.hadoop.io Interface(接口) WritableAll Known Subinterfaces(子接口):
Counter, CounterGroup, CounterGroupBase<T>, InputSplit, InputSplitWithLocationInfo, WritableComparable<T>
仅实现了Writable接口的类
数组: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,Python和PHP和Ruby结合。
3、允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
Google Protocolbuffer
PB是Google开源的一种轻量级的结构化数据存储格式,可以用于结构化数据的序
列化与反序列化,很适合做数据存储或RPC数据交换格式。
优点: 它有一个非常棒的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠”老”数据格式的程序就可以对数据结构进行升级。这样您的程序就可以不必担心因为消息结构的改变而造成的大规模的代码重构或者迁移的问题。因为添加新的消息中的 field 并不会引起已经发布的程序的任何改变。 Protocolbuffer语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。使用 Protobuf 无需学习复杂的文档对象模型,Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf 比其他的技术更加有吸引力。 不足: 由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,由于 XML 具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上 Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容。 Hadoop2.X用到的Protocolbuffer
与 XML相比,它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
Protbuf 与 XML 相比也有不足之处。它功能简单,无法用来表示复杂的概念。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博客
Hadoop序列化机制及实例的更多相关文章
- Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...
- hadoop序列化机制与java序列化机制对比
1.采用的方法: java序列化机制采用的ObjectOutputStream 对象上调用writeObject() 方法: Hadoop 序列化机制调用对象的write() 方法,带一个DataOu ...
- 大数据框架hadoop的序列化机制
Java内建序列化机制 在Windows系统上序列化的Java对象,可以在UNIX系统上被重建出来,不需要担心不同机器上的数据表示方法,也不需要担心字节排列次序. 在Java中,使一个类的实例可被序列 ...
- Hadoop序列化
遗留问题: Hadoop序列化可以复用对象,是在哪里复用的? 介绍Hadoop序列化机制 Hadoop序列化机制详解 Hadoop序列化的核心 Hadoop序列化的比较接口 ObjectWrita ...
- Zookeeper 序列化机制
一.到底在哪些地方需要使用序列化技术呢? 二.Zookeeper(分布式协调服务组件+存储系统) Java 序列化机制 Hadoop序列化机制 Zookeeper序列化机制 一.到底在哪些地方需要使用 ...
- 1 weekend110的复习 + hadoop中的序列化机制 + 流量求和mr程序开发
以上是,weekend110的yarn的job提交流程源码分析的复习总结 下面呢,来讲weekend110的hadoop中的序列化机制 1363157985066 13726230503 ...
- 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序
一:序列化概念 序列化(Serialization)是指把结构化对象转化为字节流.反序列化(Deserialization)是序列化的逆过程.即把字节流转回结构化对象.Java序列化(java.io. ...
- Hadoop学习笔记—3.Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- Hadoop序列化与Java序列化
序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输 反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象. 1.JDK的序列化 只要实现了serial ...
随机推荐
- c++第二十三天
p124~p126: 算数运算符 1.形如+ -(一元) * / % + -(二元)为算数运算符. 2.所有算数运算符都满足左结合律. 3.算数运算符的运算对象和求值结果都是右值. 4.在表达式求值之 ...
- Javaworkers团队第三周项目总结
第十三.十四周:按照项目设计,逐步完成各个模块的代码,初步完成项目雏形. 基础知识原理 1.TDD(Test Driven Development, 测试驱动开发),TDD的一般步骤如下: 明确当前要 ...
- ubuntu 16.04+Anaconda+theano+keras安装【转】
本文转载自:https://blog.csdn.net/u013786021/article/details/78370138 安装软件部分浪费了好长时间才装好.之前一直各种问题,后来卸卸了radin ...
- POJ 1142 Smith Numbers(分治法+质因数分解)
http://poj.org/problem?id=1142 题意: 给出一个数n,求大于n的最小数,它满足各位数相加等于该数分解质因数的各位相加. 思路:直接暴力. #include <ios ...
- 癌症免疫细胞治疗知识:CAR-T与TCR-T的区别在哪里?--转载
肿瘤免疫治疗,实际上分为两大类.一种把肿瘤的特征“告诉”免疫细胞,让它们去定位,并造成杀伤:另一种是解除肿瘤对免疫的耐受/屏蔽作用,让免疫细胞重新认识肿瘤细胞,对肿瘤产生攻击(一般来说,肿瘤细胞会巧妙 ...
- php 数值数组
<?php $cars=array("Volvo","BMW","Toyota"); echo ] . ] . ] . ". ...
- vue 脚手架 (三,配置文件config, build目录)
本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 上篇文章咱们介绍了vue web ...
- UVALive-3126 Taxi Cab Scheme (DAG的最小路径覆盖)
题目大意:要给n个人安排车,已知每个人的出发时间和起点与终点,问最少需要安排几辆车才能完成任务. 题目分析:最小路径覆盖.如果送完a到目的地后能在b出发之前赶来接b,那么连一条有向边a->b,最 ...
- 转载-lvs-dr模式+keepalived双机
lvs+keepalived实现高可用群集配置详解 Mon 16 April 2012 来源: https://www.linuxzen.com/lvskeepalivedshi-xian-gao-k ...
- android 知识小结-1
Java哪些数据结构是线程安全的,CurrentHashMap的原理 ConcurrentHashMap.ConcurrentSkipListMap.ConcurrentSkipListSet.Con ...
