Hadoop里面MapReduce的序列化与Java序列化比较

什么是序列化?

jvm中的一个对象,不是类,假如你想把一个对象,保存到磁盘上,必须序列化,你把文件中的对象进行恢复,是不是的反序列化。

假如你想把对象发送给另一个服务器,需要通过网络传输,也必须序列化,到另一侧要反序列化。

说到序列化,我们想到了Java的序列化。一个类实现了Serializable 接口即可。

Java对象什么时候需要序列化?

1)需要保存到本地的时候

2)需要在网络之间传输的时候

复制代码
package com.bigdata;

import java.io.Serializable;
/**
 * @Author laoyan
 * @Description TODO
 * @Date 2022/8/1 11:43
 * @Version 1.0
 */
public class User implements Serializable {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

大数据技术Hadoop并没有采用java的序列化机制,而是自己又整了一套自己的序列化机制。为什么?

Java的序列化携带的信息太多了,文件太大了,不便于在网络之间传输。

User 使用Java --> 100KB

User 使用大数据的序列化 --> 5KB

大数据采用的序列化机制是 Writable 接口。

为什么非得序列化呢?因为需要在网路之间传输。

|--------------|--------------------|--------|
| Java数据类型 | Hadoop序列化的数据类型 | 释义 |
| byte | ByteWritable | 字节类型 |
| short | ShortWritable | 短整型 |
| int | IntWritable | 整型 |
| long | LongWritable | 长整型 |
| float | FloatWritable | 单精度浮点型 |
| double | DoubleWritable | 双精度浮点型 |
| boolean | BooleanWritable | 布尔型 |
| String | Text | 字符串 |
| array | ArrayWritable | 数组 |
| Map | MapWritable | Map |
| null | NullWritable | 空 |

java的八大基本数据类型: byte short int long float double char boolean

**只需要记住:String --> Text即可。null -->**NullWritable,仅仅是为了在某个地方占位,符合语法而已。

2、测试java序列化 VS Hadoop序列化大小比较

java序列化

java 复制代码
package com.bigdata;

import java.io.Serializable;


public class User implements Serializable {

    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Hadoop的序列化

java 复制代码
package com.bigdata;

import org.apache.hadoop.io.Writable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;


public class UserWritable implements Writable {

    private String name;
    private int age;

    public UserWritable(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 序列化
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeUTF(name);
        out.writeInt(age);
    }

    // 反序列化
    @Override
    public void readFields(DataInput in) throws IOException {

        // 进行反序列化的时候,读取的顺序一定要跟序列化的时候的顺序一致,否则报错
        name = in.readUTF();
        age = in.readInt();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

使用对象流对比

java 复制代码
package com.bigdata;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;


public class TestXLH {

    public static void main(String[] args) throws Exception {
        User user = new User("zhangsan",20);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:/user1.txt"));
        objectOutputStream.writeObject(user);
        objectOutputStream.close();

        UserWritable user2 = new UserWritable("zhangsan",20);
        ObjectOutputStream objectOutputStream2 = new ObjectOutputStream(new FileOutputStream("D:/user2.txt"));
        // 此时是序列化对象去write 对象流,此处需要注意
        user2.write(objectOutputStream2);
        objectOutputStream2.close();

    }
}

java序列化的结果:

hadoop序列化的结果:

相关推荐
云和数据.ChenGuang6 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠6 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
HRaitest7 小时前
秋招技术岗招聘提效:三类 AI 招聘方案的技术底层与选型逻辑
大数据·人工智能·求职招聘·ai-native
凯凯姜7 小时前
分布式锁场景问题
分布式
starzy19908 小时前
Kafka源码深度剖析:消息有异常是如何处理的
大数据·kafka
silvamux_8 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
大大大大晴天9 小时前
每天认识一个组件:ClickHouse
大数据
步行cgn9 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠9 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
小蒜学长9 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统