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序列化的结果:

相关推荐
Mike!7 分钟前
C++进阶 set和map讲解
java·开发语言·数据结构·c++·set·map·cpp
翔云1234569 分钟前
Go语言的垃圾回收(GC)机制的迭代和优化历史
java·jvm·golang·gc
CS数模37 分钟前
2024 “华为杯” 中国研究生数学建模竞赛(D题)深度剖析|大数据驱动的地理综合问题|数学建模完整代码+建模过程全解全析
大数据·数学建模·华为
不见长安见晨雾44 分钟前
将Java程序打包成EXE程序
java·开发语言
陈吉俊1 小时前
实时流处理框架(如Flink、Spark Streaming)
大数据
@听风吟1 小时前
力扣之182.查找重复的电子邮箱
大数据·javascript·数据库·sql·leetcode
Elastic 中国社区官方博客1 小时前
Elasticsearch:检索增强生成背后的重要思想
大数据·人工智能·elasticsearch·搜索引擎·全文检索
逸狼1 小时前
【JavaEE初阶】多线程(5 单例模式 \ 阻塞队列)
java·开发语言
嵌入式冰箱1 小时前
2024年中国研究生数学建模竞赛D题“大数据驱动的地理综合问题”全析全解
大数据·数学建模
是店小二呀1 小时前
数据飞轮崛起:数据中台真的过时了吗?
大数据