Hadoop序列化

网友投稿 251 2022-11-24

Hadoop序列化

1. why 序列化
"活的"对象只存在内存中,关机断电就没有,"活的"对象只能本地进程使用,不能发到网络上另外一台计算机,序列化可以存储"活的对象",并发送到远程计算机

2. what 序列化
序列化就是把内存中对象转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输

反序列化就是将受到字节序列(或其他数据传输协议)或者硬盘中持久化的数据,转换为内存中对象

3. why不用java的序列化
java序列化是重量级序列化框架(Serializable) ,一个对象被序列化后,附带很多额外信息(校验,header,继承体系等),不便于网络中高效传输,所以Hadoop自己开发了一套序列化机制(Writable),精简高效

4. why is important to Hadoop

因为Hadoop在集群之间进行通讯或者RPC调用时,需要序列化,要求序列化快,体积小,占用带宽小 ,所以必须理解Hadoop的序列化机制

序列化和反序列化在分布式数据处理领域常见:进程通信和永久存储,然而Hadoop中各个节点之间的通信是通过远程调用(RPC)实现的

5.RPC序列化要求:
    
    (1)紧凑:紧凑的格式可以充分利用网络带宽,带宽是数据中心最稀缺的资源
    (2)快速:进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销
    (3)可扩展:协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直接引进相应协议.这些新协议,反序列化的方式能够支持新的协议报文
    (4)相互操作:支持不同语言写的客户端和服务端进行交互

 

常用的数据类型对应的 hadoop 数据序列化类型
JAVA类型 Hadoop Writable 
boolean  Boolean Writable
byte Byte Writable
int IntWritable
float

FloatWritable

long LongWritable
duble DoubleWritable
string Text
map

Map Writable

array ArrayWritable

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

(1) 自定义bean对象要想序列化传输,必须实现序列化接口注意

实现序列化接口,需要注意以下 7 项
1. 实现Writable接口

2.反序列化,需要反射调用空构造函数,所以必须有空构造

public FlowBean() {
super();
}

3.重写序列化方法

 

@Override
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}

 

4. 重写反序列化方法

@Override
public void readFields(DataInput in) throws IOException {
upFlow = in.readLong();
downFlow = in.readLong();
sumFlow = in.readLong();
}

5. 反序列化的顺序和序列化的顺序完全一致
6. 要想把结果显示在文件中,需要重写toString().可以用"\t"分开

7. 如果需要将自定义的bean放在key中传输,则还需要实现comparable接口

,MapReduce框中的shuffle过程会对key进行排序

Override
public int compareTo(FlowBean o) {
// 倒序排列,从大到小
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}

 

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java面向对象基础知识之数组和链表
下一篇:RS232串口调试要点
相关文章

 发表评论

暂时没有评论,来抢沙发吧~