一、优点
1、紧凑:节省内存
2、快速:读取速度快
3、可扩展:随着协议升级
4、互操作:支持多语言交互
二、Bean对象实现序列化
1、步骤
a、必须实现Writable接口 b、必须有空参构造,反序列化时,反射调用 c、重写序列化方法 d、重写反序列化方法 e、序列化方法和反序列化方法参数顺序要一致 f、重写 toString 用' '连接 h、如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的Shuffle过程要求对key必须能排序
三、示例
1、前提条件
创建Maven项目,导入依赖,配置log日志
2、思路
a、实现接口Writable
b、自定义属性
c、无参构造函数
d、get和set
e、tostring 连接使用
f、序列化
g、反序列化
注意:序列化和反序列化的顺序相同,相当于队列
3、代码
package com.flow; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; public class FlowBean implements Writable { private long upFlow; // 上传流量 private long downFlow; // 下载流量 private long sumFlow; // 总流量 public FlowBean() { } public long getUpFlow() { return upFlow; } public void setUpFlow(long upFlow) { this.upFlow = upFlow; } public long getDownFlow() { return downFlow; } public void setDownFlow(long downFlow) { this.downFlow = downFlow; } public long getSumFlow() { return sumFlow; } public void setSumFlow(long sumFlow) { this.sumFlow = sumFlow; } @Override public String toString() { return upFlow + " " + downFlow + " " + sumFlow; } // 序列化 public void write(DataOutput out) throws IOException { out.writeLong(upFlow); out.writeLong(downFlow); out.writeLong(sumFlow); } // 反序列化 public void readFields(DataInput in) throws IOException { this.upFlow = in.readLong(); this.downFlow = in.readLong(); this.sumFlow = in.readLong(); } public void set(long upFlow, long downFlow){ this.upFlow = upFlow; this.downFlow = downFlow; this.sumFlow = upFlow + downFlow; } }