【Hadoop】MapReduce序列化

一、概述

序列化(Serialization)是指把结构化对象转化为字节流
反序列化(Deserialization)是序列化的逆过程。把字节流转为结构化对象

当要在进程间传递对象或持久化对象的时候,就需要序列化对象成字节流,反之当要将接收到或从磁盘读取的字节流转换为对象,就要进行反序列化

Java的序列化(Serializable)是一个重量级序列化框架,一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系…),不便于在网络中高效传输;所以,hadoop自己开发了一套序列化机制(Writable),精简,高效。不用像java对象类一样传输多层的父子关系,需要哪个属性就传输哪个属性值,大大的减少网络传输的开销

Writable是Hadoop的序列化格式,hadoop定义了这样一个Writable接口。
一个类要支持可序列化只需实现这个接口即可

public interface Writable {  
	void write(DataOutput out) throws IOException;  
	void readFields(DataInput in) throws IOException;  
} 

二、 Writable序列化接口

如需要将自定义的bean放在key中传输,则还需要实现comparable接口,因mapreduce框中的shuffle过程一定会对key进行排序,此时,自定义的bean实现的接口应该是:
public class FlowBean implements WritableComparable<FlowBean>
需要自己实现的方法是:

/**
 反序列化的方法,反序列化时,从流中读取到的各个字段的顺序
 应该与序列化时写出去的顺序保持一致
 */
	@Override
	public void readFields(DataInput in) throws IOException {
		upflow = in.readLong();
		dflow = in.readLong();
		sumflow = in.readLong();
	}
	/**
	 * 序列化的方法
	 */
	@Override
	public void write(DataOutput out) throws IOException {
		out.writeLong(upflow);
		out.writeLong(dflow);
		out.writeLong(sumflow);
	}
	
	/**
	compareTo方法用于将当前对象与方法的参数进行比较。
	如果指定的数与参数相等返回0。
	如果指定的数小于参数返回 -1。
	如果指定的数大于参数返回 1。
	返回正数的话,当前对象(调用compareTo方法的对象o1)
	要排在比较对象(compareTo传参对象o2)后面,返回负数的话,放在前面。
	*/
	@Override
	public int compareTo(FlowBean o) {
		//实现按照sumflow的大小倒序排序
		return sumflow>o.getSumflow()?-1:1;
	}
发布了97 篇原创文章 · 获赞 349 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/qq_43733123/article/details/105311048