Hadoop 数据序列化

1. Hadoop序列化

1.1. 什么是序列化

序列化就是把内存中的对象转换成字节序列(二进制流)以便于存储到磁盘(持久化)和网络传输

反序列化就是将字节序列转换成内存中的对象。

1.2. 为什么要序列化

原本对象只能存在于内存中

  • 想把对象保存到磁盘,要先序列化,把对象转为二进制数据的形式保存到磁盘。
  • 想把对象通过网络传输给远程计算机,要先序列化,把对象转为二进制数据的形式传输给远程永无止息器。

序列化还有跨语言、跨平台的好处。例如Java对象序列化后,二进制流可以由PHP客户端接收,再按一定的规则将二进制流反序列化为PHP中的对象

Hadoop涉及数据的存储和传输,所以要引入序列化

1.3. Hadoop为什么不使用Java自带的Serializable序列化

Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息、Header、继承体系等),不便于在网络中高效传输。所以,Hadoop自己开发了一套序列化机制(Writable)。

1.4. Hadoop序列化的特点

Hadoop中各个节点的通信是通过远程调用(RPC)实现的,那么RPC序列化要求具有以下特点:
1)紧凑:紧凑的格式能让我们充分利用网络带宽,而带宽是数据中心最稀缺的资
2)快速:进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是基本的;
3)可扩展:随着通信协议的升级而可升级(支持通信协议的变化);
4)互操作:能支持不同语言写的客户端和服务端进行交互;例如Java对象序列化后,二进制流可以由PHP客户端接收,再按一定的规则将二进制流反序列化为PHP中的对象

1.5. Hadoop中常用的序列化类型

Java类型 Hadoop Writable类型
boolean BooleanWritable
byte ByteWritable
int IntWritable
float FloatWritable
long LongWritable
double DoubleWritable
String Text
map MapWritable
array ArrayWritable

自定义bean的序列化

在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在Hadoop框架内部传递一个bean对象,那么该对象就需要实现序列化接口

具体实现bean对象序列化步骤如下7步

panchaoxin wechat
关注我的公众号
支持一下