Hadoop序列化与反序列化

一、Hadoop序列化概述

(一)什么是序列化和反序列化

  • 序列化:序列化是将对象(如Java中的类实例)转换为字节序列的过程。在Hadoop中,数据在分布式系统中传输或者存储到磁盘时,需要将数据对象序列化为字节流。例如,当MapReduce作业中的map任务输出数据,这些数据要通过网络传输给reduce任务或者存储到HDFS(Hadoop分布式文件系统)中,就需要序列化操作。
  • 反序列化:反序列化是序列化的逆过程,即将字节序列还原为对象。在Hadoop中,当从磁盘读取数据或者从网络接收数据时,需要进行反序列化操作。比如reduce任务从HDFS中读取map任务输出的中间结果文件,就需要将文件中的字节序列反序列化为可以操作的对象。

(二)Hadoop序列化的重要性

  • 高效的数据传输和存储:Hadoop处理海量数据,高效的序列化和反序列化机制可以减少数据在网络传输和磁盘存储时的开销。例如,相比Java自带的序列化机制,Hadoop的序列化格式通常更加紧凑,可以节省存储空间和传输带宽。
  • 跨平台兼容性:Hadoop是一个分布式系统,可能运行在不同操作系统和硬件架构的机器上。良好的序列化和反序列化机制可以保证数据在不同平台之间能够正确地传输和还原。

二、Hadoop序列化机制

(一)Writable接口

  • 介绍 :这是Hadoop提供的一个核心序列化接口。如果一个类实现了Writable接口,就表示这个类的对象可以被序列化和反序列化。例如,Hadoop中常用的IntWritableLongWritableText等类都实现了Writable接口。
  • 实现方式
    • write方法 :用于将对象写入到输出流(如DataOutput)。这个方法定义了对象如何被序列化。例如,IntWritable类的write方法会将整数值写入到输出流中。当调用write方法时,它会将对象的内部数据按照一定的格式转换为字节序列。
    • readFields方法 :用于从输入流(如DataInput)读取数据并恢复对象的状态。这个方法定义了对象如何被反序列化。例如,Text类的readFields方法会从输入流中读取字节序列,并将其转换为字符串对象。在反序列化过程中,readFields方法会根据序列化时的格式来解析字节序列,恢复对象的原始状态。

(二)WritableComparable接口

  • 介绍 :这个接口继承了Writable接口和Comparable接口。它主要用于那些需要进行排序的序列化对象。在MapReduce框架中,map任务的输出键值对和reduce任务的输入键值对通常需要按照键进行排序,所以很多键类(如IntWritableLongWritable等)都实现了WritableComparable接口。
  • 实现方式
    • 除了实现Writable接口的writereadFields方法外,还需要实现Comparable接口的compareTo方法。compareTo方法用于比较两个对象的大小,以便在排序过程中确定对象的顺序。例如,IntWritable类的compareTo方法会比较两个整数值的大小,根据比较结果来决定排序顺序。

三、Hadoop序列化和反序列化的使用场景

(一)MapReduce作业

  • map任务输出 :map任务处理输入的键值对后,会输出中间结果。这些中间结果的键和值都必须是实现了Writable接口的类。例如,一个map任务可能输出Text作为键(表示单词)和IntWritable作为值(表示单词出现的次数)。这些输出数据会被序列化后发送到reduce任务或者存储到磁盘。
  • reduce任务输入:reduce任务从HDFS中读取map任务输出的中间结果文件。这些文件中的数据是序列化的字节序列,reduce任务会通过反序列化操作将它们转换为可以操作的对象。然后reduce任务根据键对值进行聚合等操作,并输出最终结果。最终结果的键和值也必须是实现了Writable接口的类,以便可以被序列化后存储到HDFS或者发送到其他地方。

(二)HDFS

  • 数据存储和读取:当数据存储到HDFS中时,如果数据是对象形式(如Java对象),就需要进行序列化操作。例如,一些自定义的复杂数据结构对象可以通过实现Writable接口进行序列化后存储到HDFS。当需要从HDFS中读取这些数据时,就进行反序列化操作,将字节序列还原为对象,以便进行后续的处理操作。
相关推荐
武子康6 小时前
大数据-244 离线数仓 - Hive ODS 层建表与分区加载实战(DataX→HDFS→Hive)
大数据·后端·apache hive
武子康1 天前
大数据-243 离线数仓 - 实战电商核心交易增量导入(DataX - HDFS - Hive 分区
大数据·后端·apache hive
代码匠心3 天前
从零开始学Flink:Flink SQL四大Join解析
大数据·flink·flink sql·大数据处理
武子康4 天前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
SelectDB5 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康5 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
茶杯梦轩5 天前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
IvanCodes5 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康6 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
回家路上绕了弯7 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端