欢迎投稿

今日深度:

Hadoop之Hadoop序列化,

Hadoop之Hadoop序列化,


Hadoop之Hadoop序列化


目录


1. 什么是序列化


2. 为什么要序列化

一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。


3. 为什么不用Java的序列化

Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),特点如下:


4. 常用数据序列化类型

Java类型 Hadoop Writable类型
boolean BooleanWritable
byte ByteWritable
int IntWritable
float FloatWritable
long LongWritable
double DoubleWritable
String Text
map MapWritable
array ArrayWritable

5. 自定义bean对象实现序列化接口(Writable)

自定义bean对象要想序列化传输,必须实现序列化接口,需要注意以下7项。

public FlowBean() {
	super();
}
  1. 重写序列化方法
@Override
	public void write(DataOutput out) throws IOException {
		out.writeLong(upFlow);
		out.writeLong(downFlow);
		out.writeLong(sumFlow);
	}
  1. 重写反序列化方法
@Override
public void readFields(DataInput in) throws IOException {
	upFlow = in.readLong();
	downFlow = in.readLong();
	sumFlow = in.readLong();
}
  1. 注意反序列化的顺序和序列化的顺序完全一致
  2. 要想把结果显示在文件中,需要重写toString(),可用”\t”分开,方便后续用。
  3. 如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序。
@Override
public int compareTo(FlowBean o) {
	// 倒序排列,从大到小
	return this.sumFlow > o.getSumFlow() ? -1 : 1;
}

www.htsjk.Com true http://www.htsjk.com/Hadoop/36110.html NewsArticle Hadoop之Hadoop序列化, Hadoop之Hadoop序列化 目录 1. 什么是序列化 2. 为什么要序列化 一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使...
相关文章
    暂无相关文章
评论暂时关闭