项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1、为什么要序列化?

一般来说,"活的"对象只存在内存里,关机断电就没有了。而且"活的"对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储"活的"对象,可以将"活的"对象发送到远程计算机。

2、什么是序列化?

序列化就是指将对象(实例)转化为字节流(字符数组)。反序列化就是将字节流转化为对象的逆过程。 于是,如果想把"活的"对象存储到文件,存储这串字节即可,如果想把"活的"对象发送到远程主机,发送这串字节即可,需要对象的时候,做一下反序列化,就能将对象"复活"了。

3、为什么不用Java的序列化?

Java的序列化机制的缺点就是计算量开销大,且序列化的结果体积大太,有时能达到对象大小的数倍乃至十倍。它的引用机制也会导致大文件不能分割的问题。这些缺点使得Java的序列化机制对Hadoop来说是不合适的。于是Hadoop设计了自己的序列化机制。

4、为什么序列化对Hadoop很重要?

因为Hadoop在集群之间进行通讯或者RPC调用的时候,需要序列化,而且要求序列化要快,且体积要小,占用带宽要小。所以必须理解Hadoop的序列化机制。

序列化和反序列化在分布式数据处理领域经常出现:进程通信和永久存储。然而Hadoop中各个节点的通信是通过远程调用(RPC)实现的,那么 RPC序列化要求具有以下特点:
1.紧凑:紧凑的格式能让我们能充分利用网络带宽,而带宽是数据中心最稀缺的资源
2.快速:进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是基本的
3.可扩展:协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直接引进相应的协议,这些是新协议,原序列化方式能支持新的协议报文
4.互操作:能支持不同语言写的客户端和服务端进行交互

5、Hadoop中定义哪些序列化相关的接口呢?

Hadoop中定义了两个序列化相关的接口:Writable 接口和 Comparable 接口,这两个接口可以合并成一个接口 WritableComparable
下面我们就了解一下这两个序列化接口:

Writable接口
所有实现了Writable接口的类都可以被序列化和反序列化。 Writable 接口中定义了两个方法,分别为write(DataOutput out)和readFields(DataInput in)。write 用于将对象状态写入二进制格式的DataOutput流,readFields 用于从二进制格式的 DataInput 流中读取对象状态。

package org.apache.hadoop.io;import java.io.DataOutput;import java.io.DataInput;import java.io.IOException;import org.apache.hadoop.classification.InterfaceAudience;import org.apache.hadoop.classification.InterfaceStability;public interface Writable {/*** 将对象转换为字节流并写入到输出流out中*/void write(DataOutput out) throws IOException;/*** 从输入流in中读取字节流反序列化为对象*/void readFields(DataInput in) throws IOException;
}

对于一个特定的 Writable,我们可以对它进行哪些操作呢?

有两种常用操作:赋值和取值,这里我们以 IntWritable 为例来分别说明(IntWritable是对Java的int类型的封装)

1)通过 set() 函数设置 IntWritable 的值

IntWritable value = new IntWritable();

value.set(588)

类似的,也可以使用构造函数来赋值。

IntWritable value = new IntWritable(588);

2)通过get()函数获取 IntWritable 的值。

int result = value.get();// 这里获取的值为588

Comparable接口

所有实现了Comparable的对象都可以和自身相同类型的对象比较大小。该接口定义为:

package java.lang;import java.util.*;public interface Comparable<T> {/*** 将this对象和对象o进行比较,约定:返回负数为小于,零为大于,整数为大于*/public int compareTo(T o);
}

##6、Hadoop 自定义Writable 接口

虽然 Hadoop 自带一系列Writable实现,如IntWritable,LongWritable等,可以满足一些简单的数据类型。但有时,复杂的数据类型需要自己自定义实现。通过自定义Writable,能够完全控制二进制表示和排序顺序。

现有的 Hadoop Writable 应用已得到很好的优化,但为了对付更复杂的结构,最好创建一个新的 Writable 类型,而不是使用已有的类型。下面我们来学习一下如何自定义 Writable 类型,以自定义一个Writable 类型TextPair为例,如下所示

import java.io.*;import org.apache.hadoop.io.*;/**
* @ProjectName Serialize
* @ClassName TextPair
* @Description 自定义Writable类型TextPair
* @Author 刘吉超
* @Date 2016-04-16 23:59:19
*/
public class TextPair implements WritableComparable<TextPair> {// Text 类型的实例变量private Text first;// Text 类型的实例变量private Text second;public TextPair() {set(new Text(), new Text());}public TextPair(String first, String second) {set(new Text(first), new Text(second));}public TextPair(Text first, Text second) {set(first, second);}public void set(Text first, Text second) {this.first = first;this.second = second;}public Text getFirst() {return first;}public Text getSecond() {return second;}@Override// 将对象转换为字节流并写入到输出流out中public void write(DataOutput out) throws IOException {first.write(out);second.write(out);}@Override// 从输入流in中读取字节流反序列化为对象public void readFields(DataInput in) throws IOException {first.readFields(in);second.readFields(in);}@Overridepublic int hashCode() {return first.hashCode() * 163 + second.hashCode();}@Overridepublic boolean equals(Object o) {if (o instanceof TextPair) {TextPair tp = (TextPair) o;return first.equals(tp.first) && second.equals(tp.second);}return false;}@Overridepublic String toString() {return first + "\t" + second;}// 排序@Overridepublic int compareTo(TextPair tp) {int cmp = first.compareTo(tp.first);if (cmp != 0) {return cmp;}return second.compareTo(tp.second);}
}

TextPair对象有两个Text实例变量(first和second)、相关的构造函数、get方法和set方法。 所有的Writable实现都必须有一个默认的构造函数,以便MapReduce框架能够对它们进行实例化,进而调用readFields()方法来填充它们的字段。Writable实例是易变的、经常重用的,所以应该尽量避免在 write() 或 readFields() 方法中分配对象。

通过委托给每个 Text 对象本身,TextPair 的 write() 方法依次序列化输出流中的每一个 Text 对象。同样也通过委托给 Text 对象本身,readFields() 反序列化 输入流中的字节。DataOutput 和 DataInput 接口有丰富的整套方法用于序列化和反序列化 Java 基本类型,所以在一般情况下,能够完全控制 Writable 对象的数据传输格式。

正如为Java写的任意值对象一样,会重写java.lang.Object的hashCode()、equals()和toString()方法。 HashPartitioner使用hashcode()方法来选择reduce分区,所以应该确保写一个好的哈希函数来确定reduce函数的分区在大小上是相当的。

TextPair是WritableComparable的实现,所以它提供了compareTo()方法的实现,加入我们希望的排序:通过一个一个String逐个排序

原文链接地址:http://www.cnblogs.com/codeOfLife/p/5400307.html#为什么序列化对Hadoop很重要

hadoop文件的序列化相关推荐

  1. hadoop文件存储位置_Hadoop文件的存储格式实例详解

    sequence文件存储格式 1.txt 纯文本格式,若干行记录.默认用字符编码存储 2.SequenceFile格式(顺序文件格式,可进行切割) key-value 格式进行存储,最终形成的是一个二 ...

  2. Hadoop 文件命令

    Hadoop 文件命令 * 文件操作  * 查看目录文件  * $ hadoop dfs -ls /user/cl  *  * 创建文件目录  * $ hadoop dfs -mkdir /user/ ...

  3. Android xml文件的序列化

    Android提供了XmlSerializer来实现XML文件的序列化.相比传统方式,更高效安全. 传统方式: public void backSms(View view){//假设我已经获取到了所有 ...

  4. Hadoop文件基础操作命令

    1.查看进程jps 2.进入配置文件(可能路径不同,具体路径以格式化后通知的文件储存路径为主) [root@master ~]# cd /tmp/hadoop-root/dfs/name/curren ...

  5. 基于Hadoop文件存储系统的研发

                               基于Hadoop文件存储系统的研发                                   Research and Developm ...

  6. 文件I/O:文件流→序列化

    文件I/O:文件流→序列化 ★文件流 文件操作是最简单最直接也是最容易想到的一种方式,我们说的文件操作不仅仅是通过FileInputStream/FileOutputStream这么"裸&q ...

  7. Java拾遗:004 - JDK、Hadoop、Hessian序列化

    2019独角兽企业重金招聘Python工程师标准>>> JDK序列化 在分布式架构中,序列化是分布式的基础构成之一,我们需要把单台设备上的数据通过序列化(编码.压缩)后通过网络传输给 ...

  8. Python 文件的序列化和反序列化

    接上篇 Python 文件的读写 一.文件的序列化 上篇提到,f.write()函数只能将字符串(str)类型写入文件,但其他类型例如列表.字典等无法写入,需要提前转换再写入文件.一般不能直接用str ...

  9. Hadoop IO 文件压缩 序列化

    文件中使用getcodec()方法,可以将文件属性名映射到一个CompressionCodec,该去文件的Path对象当参数. CodecPool使用原生的代码库并且需要在用执行中执行大量解压和压缩, ...

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

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

最新文章

  1. nodejs 打印返回的json
  2. ArrayList和Vector的异同
  3. applicationcontext理解使用
  4. 怎么利用GitHub
  5. 从虚幻4动画系统与控制器交互理解数据驱动(一)古老的写法
  6. 计算机英语词汇解释,常见计算机英语词汇解释
  7. 在IIS管理器添加网站
  8. PCB布线宽度与 mil与mm转换 等技巧
  9. Java面试智力题逻辑题汇总2021
  10. Unity-lambda表达式
  11. 第三方对接秀米图文编辑器遇到的坑
  12. 如何使用语音验证码API
  13. 翻译管理协作翻译平台-crowdin
  14. 计算时间复杂度--(简单版)
  15. Spring Boot 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)
  16. CheatSheet——OpenCV
  17. 协整检验——进出口与经济增长
  18. 工具篇:解压缩工具 tar
  19. matlab/simulink电力电子仿真直流电机设置和使用
  20. 分享88个ASP交友会员源码,总有一款适合您

热门文章

  1. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
  2. Golang 中使用多维 map
  3. 【FPGA】TestBench中关于@eachvec
  4. CSS样式表初始化杂谈
  5. java中的io系统详解[转]
  6. C语言中 malloc,calloc 和 realloc 函数之间的区别
  7. 034 Maven中的dependencyManagement和dependencies区别
  8. 各种数据库默认端口汇集
  9. 由DispatcherServlet看spring mvc请求处理过程
  10. java代码获取系统时间相差8小时