自学内容网 自学内容网

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序列化

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

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;
    }
}

使用对象流对比

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


原文地址:https://blog.csdn.net/Yz9876/article/details/142368509

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!