在hadoop中實現了一套自己的序列化框架,相對于JDK自帶的序列化工具,它更加簡潔,在集群信息的傳遞上速度更快,容量更小。特點如下:
1. 數據緊湊
帶寬是集群中信息傳遞的最寶貴的資源,所以我們必須設法縮小傳遞信息的大小。為了更好的控制序列化整個流程使用Writable對象,java序列化過程中會保存類的所有信息以及依賴等,Hadoop序列化不需要。
2. 對象可重用
JDK的反序列化會不斷地創建對象,這肯定會造成一定的系統開銷,但是在hadoop反序列化中,能重復的利用一個對象的readField方法來重新產生不同的對象。
3. 可擴展性
hadoop自己寫序列化很容易,可以通過實現hadoop的Writable接口實現序列化,或者實現WritableComparable接口實現可比較大小的序列化對象。
一、Hadoop Writable框架
Writable 接口如下:
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface Writable {
/**
* 序列化一個對象,將一個對象按照某個數據傳輸格式寫入到out流中
* @param out <code>DataOuput</code> to serialize this object into.
* @throws IOException
*/
void write(DataOutput out) throws IOException;
/**
* 反序列化,從in流中讀入字節,按照某個數據傳輸格式讀出到一個對象中
* @param in <code>DataInput</code> to deseriablize this object from.
* @throws IOException
*/
void readFields(DataInput in) throws IOException;
}
二、Java基本類型的Writable類
Java基本類型 | Writable實現 | 序列化大小 |
---|---|---|
String | Text | |
null | NullWritable | 0 |
boolean | BooleanWritable | 1 |
byte | ByteWritable | 1 |
short | ShortWritable | 2 |
int | IntWritable | 4 |
float | FloatWritable | 4 |
long | LongWritable | 8 |
double | DoubleWritable | 8 |
三、自定義類型示例(實現WritableComparable接口)
package com.seriable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
public class PeopleWritable implements WritableComparable<PeopleWritable> {
private IntWritable age;
private Text name;
public PeopleWritable(){
}
public PeopleWritable(IntWritable age, Text name) {
super();
this.age = age;
this.name = name;
}
public IntWritable getAge() {
return age;
}
public void setAge(IntWritable age) {
this.age = age;
}
public Text getName() {
return name;
}
public void setName(Text name) {
this.name = name;
}
//序列化方法
public void write(DataOutput out) throws IOException {
age.write(out);
name.write(out);
}
//反序列化方法
public void readFields(DataInput in) throws IOException {
age.readFields(in);
name.readFields(in);
}
//比較函數,使得對象可比較大小
public int compareTo(PeopleWritable o) {
int cmp = age.compareTo(o.getAge());
if(0 !=cmp)return cmp;
return name.compareTo(o.getName());
}
}