Hadoop的序列化与反序列化实操

简介: Hadoop的序列化与反序列化实操

0x00 文章内容


  1. 编写代码
  2. 测试结果


0x01 编写代码


前提:因为需要用到Hadoop,所以需要先引入Hadoop相关的jar包

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.5</version>
</dependency>


image.png


1. 编写对象类

a. 编写Block类

package com.shaonaiyi.hadoop.serialize;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:51
 * @Description 定义引入Hadoop序列化机制的BlockWritable类
 */
public class BlockWritable implements Writable {
    private long blockId;
    private long numBytes;
    private long generationStamp;
    public BlockWritable(long blockId) {
        this.blockId = blockId;
    }
    public BlockWritable(long blockId, long numBytes, long generationStamp) {
        this.blockId = blockId;
        this.numBytes = numBytes;
        this.generationStamp = generationStamp;
    }
    public long getBlockId() {
        return blockId;
    }
    public long getNumBytes() {
        return numBytes;
    }
    public long getGenerationStamp() {
        return generationStamp;
    }
    @Override
    public String toString() {
        return "Block{" +
                "blockId=" + blockId +
                ", numBytes=" + numBytes +
                ", generationStamp=" + generationStamp +
                '}';
    }
    public void write(DataOutput dataOutput) throws IOException {
        dataOutput.writeLong(blockId);
        dataOutput.writeLong(numBytes);
        dataOutput.writeLong(generationStamp);
    }
    public void readFields(DataInput dataInput) throws IOException {
        this.blockId = dataInput.readLong();
        this.numBytes = dataInput.readLong();
        this.generationStamp = dataInput.readLong();
    }
}


2. 编写调用测试代码

a. 编写序列化与反序列化代码

package com.shaonaiyi.hadoop.serialize;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableFactories;
import java.io.*;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:53
 * @Description 编写Hadoop序列化机制测试类代码
 */
public class HadoopSerializableTest {
    public static void main(String[] args) throws IOException {
        String fileName = "blockWritable.txt";
        serialize(fileName);
//        deSerialize(fileName);
    }
    private static void serialize(String fileName) throws IOException {
        BlockWritable block = new BlockWritable(78062621L, 39447651L, 56737546L);
        File file = new File(fileName);
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
        block.write(dataOutputStream);
        dataOutputStream.close();
    }
    private static void deSerialize(String fileName) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(fileName);
        DataInputStream dataInputStream = new DataInputStream(fileInputStream);
        Writable writable = WritableFactories.newInstance(BlockWritable.class);
        writable.readFields(dataInputStream);
        System.out.println((BlockWritable)writable);
    }
}


0x02 测试结果


1. 测试序列化

a. 执行序列化方法,发现项目与main文件夹同级目录下多了一个blockWritable.txt文件,双击打开:

image.png


查看大小,发现是24字节:


image.png


我们定义的BlockWritable类,Long类是8个字节,三个Long类型的属性是24个字节,没有引入额外的信息,是我们想要的结果,请与上一篇教程做比较:Java的序列化与反序列化实操

2. 测试反序列化

a. 打开反序列化方法,执行:


//        serialize(fileName);
        deSerialize(fileName);


image.png


发现可以将BlockWritable对象反序列化出来了。

3. 测试修改对象代码

a. 尝试修改BlockWritable类,如在里面添加一个无参数的构造方法


    public BlockWritable() {
    }


b. 然后再反序列化,发现执行的结果并没有报错,与前面一样。


image.png


0xFF 总结


  1. Hadoop的序列化机制解决了内置的Java序列化接口的缺陷。
  2. 本教程拥有前置教程:Java的序列化与反序列化实操
  3. Hadoop的序列化机制接口如下:


image.png


在平时代码中,可以参考如下:


 Text text = new Text();
 String word = "hello";
 text.set(word);
 IntWritable intWritable = new IntWritable(3);
相关文章
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
4月前
|
存储 开发框架 .NET
解锁SqlSugar新境界:利用Serialize.Linq实现Lambda表达式灵活序列化与反序列化,赋能动态数据查询新高度!
【8月更文挑战第3天】随着软件开发复杂度提升,数据查询的灵活性变得至关重要。SqlSugar作为一款轻量级、高性能的.NET ORM框架,简化了数据库操作。但在需要跨服务共享查询逻辑时,直接传递Lambda表达式不可行。这时,Serialize.Linq库大显身手,能将Linq表达式序列化为字符串,实现在不同服务间传输查询逻辑。结合使用SqlSugar和Serialize.Linq,不仅能够保持代码清晰,还能实现复杂的动态查询逻辑,极大地增强了应用程序的灵活性和可扩展性。
157 2
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
111 3
|
2月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
41 1
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
47 0
|
3月前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
45 1

相关实验场景

更多