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步