Hadoop序列化与反序列化

什么是序列化和反序列

序列化定义:就是把内存中的对象,转换为字节序列,以便于存储到磁盘或网络传输,此过程被称为序列化。

反序列化定义:将字节序列或磁盘中的持久化字节数据,转换为内存中的对象的过程。

hadoop为什么需要序列化和反序列化

数据经过mapper 任务的处理后,会产生溢出文件,这些文件会被保存到磁盘上。mapper任务完成后,reducer会通过http get的方式从mapper端拷贝对应分区的数据,中间需要经过网络传输。需要做持久化(存盘)或网络传输,这中间就需要做数据的序列化和反序列操作。

为什么不使用Java自带的序列化(Serializable)

Java的序列化是一个偏重量序列化,一个对象被序列化后,会带有很多的额外的信息,比如各种校验信息、继承体系、Header,从而导致体积较大。又由于hadoop处理的数据量一般都比较大,所以该方式不利于数据的传输。

Hadoop序列化的特点:

  1. 紧凑:节省存储空间

  2. 快捷:读写数据的额外开销比较小

  3. 可扩展型更强:可以随着通讯协议升级而升级。

  4. 跨语言:支持多语言的交互。

如何使用Hadoop的序列化和反序列化

Java类型 Hadoop Writable类型
Byte ByteWritable
Int IntWritable
Long LongWritable
Float FloatWritable
Double DoubleWritable
Boolean BooleanWritable
String Text
Map MapWritable
Array ArrayWritable
Null NullWritable

有些时候这些基本的类不能满足我们的开发需求,需要自定义类,那么这些自定义的类如何实现序列化和反序列化呢?

具体实现的步骤如下:

  1. 实现Writable接口

  2. 预置一个空的构造函数,这是因为在发序列化时会被调用的

java 复制代码
public Xxx(){
   super();
}

3.重写序列化的方法

java 复制代码
@Override
public void write(DataOutput out) throws IOException{
    out.writeInt(age);
    out.writeLong(xx);
    ....
}

4.重写反序列化的方法

java 复制代码
@Override
public void readFields(DataInput in) throws IOException{
    age = in.readInt();
    xx = in.readLong();
    ....
}

顺序一定要保持一致,先序列化的谁,一定要先反序列化谁。

5.重写类的toString()方法

6.如果该类需要作为Mapper的key中使用,还需要实现Comparable接口,这是因为Shuffle过程中需要对Mapper的key做排序。

相关推荐
☞遠航☜2 小时前
kafka快速上手
分布式·kafka·linq
芝士爱知识a5 小时前
2026高含金量写作类国际竞赛汇总与测评
大数据·人工智能·国际竞赛·写作类国际竞赛·写作类比赛推荐·cwa·国际写作比赛推荐
鹧鸪云光伏9 小时前
基于支架参数一键生成光伏全套CAD图纸
大数据·信息可视化·cad·光伏·储能设计方案
黎阳之光11 小时前
黎阳之光:以视频孪生领跑全球,赋能数字孪生水利智能监测新征程
大数据·人工智能·算法·安全·数字孪生
有想法的py工程师12 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
2501_9333295512 小时前
技术架构深度解析:Infoseek舆情监测系统的全链路设计与GEO时代的技术实践
开发语言·人工智能·分布式·架构
鬼先生_sir13 小时前
Zookeeper:从入门到精通
分布式·zookeeper·云原生
safestar201213 小时前
ES批量写入性能调优:BulkProcessor 参数详解与实战案例
java·大数据·运维·jenkins
weixin_1562415757613 小时前
基于YOLOv8深度学习花卉识别系统摄像头实时图片文件夹多图片等另有其他的识别系统可二开
大数据·人工智能·python·深度学习·yolo
科技与数码13 小时前
互联网保险迎来新篇章,元保方锐分享行业发展前沿洞察
大数据·人工智能