序列化和压缩

本文介绍了序列化在分布式数据处理中的作用,详细讲解了Java内置序列化和Hadoop自定义序列化的区别和特点,包括Hadoop的Writeable接口。此外,还探讨了Hadoop的压缩机制,如Hadoop压缩API的使用,支持Snappy压缩,并阐述了如何在Hadoop框架下集成新的压缩算法。
摘要由CSDN通过智能技术生成
hadoop需要处理P、T级别的数据,所以在org.apache.hadoop.io中包含一些面向海量数据处理的基本工具。

1、序列化

对象的序列化(Serialization)用于将对象编码成一个字节流,以及从字节流中重新构建一个对象。相反的,处理过程称为反序列化(Deserializing)
序列化有三种主要的用途:
  • 作为一种持久化格式,一个对象被序列化后,他的编码可以被存储在磁盘上,供以后反序列化使用
  • 作为一种通信数据格式:序列化结果可以从一个虚拟机通过网络传到另一个虚拟机上
  • 作为一种拷贝,克隆机制:将对象序列化到内存的缓存区,然后 通过反序列化,得到一个已知对象的深拷贝的新对象。
    在分布式数据处理中,主要提到前面两种功能;

1.1 java内建序列化机制

将对象转换为连续的byte数据,并能自动处理不同操作上的差异,在windows系统序列化的对象可以在UNIX系统上被重建出来

在Java中一个类的实例可被序列非常简单,只需在类声明中加入implements Serializable即可。Serializable接口是一个标志,不具有任何成员函数。

public interface Serializable{
   
}

该接口没有任何方法所以不需要对类进行修改,Block类通过声明它实现了Serializable接口,立即可以获得Java提供的序列化功能。

public class Block implements WritableComparable<Block>,Serializable

由于序列化主要应用在I/O,如果想让某个对象执行序列化操作,可以在某种OutpuStream对象的基础上创建一个对象流ObjectOutputStream对象上然后调用writeObject()就可以了

writeObject()方法写入实现了Serializable接口对象的状态信息,输出数据将被送至该OutputStream。多个对象的序列化可以在ObjectOutputStream对象上多次调用writeObject()分别写入这些对象。

对于java基本类型的序列化,ObjectOutputStream提供了writeBoolean()、writeByte()等方法

输入过程类似,将InputStream包装在ObjectOutputStream中并调用readObject()方法,该方法返回一个 指向 向上转型后的Object的应用,通过向下转型,就可以得到正确结果,读取对象时,必须小心追踪存储的对象的数量、顺序以及他们的类型。

但由于java序列化机制非常聪明,关于一个类的几乎各个信息都能完整的序列化转换下来,但会膨胀的非常厉害,因此,Hadoop需要新的一个序列化机制。

1.2Hadoop序列化机制

Hadoop的序列化调用对象的wrtie()方法(带有一个类型为DataOutput的参数),将对象序列化到流中,反序列化也一样,通过对象的readFields(),从流中读取数据。
java反序列化会不断创建新的对象,而hadoop可以复用对象,而不是得到反序列化对象的结果对象,减少了java对象的分配和回收

public static void  main(String[] args){
   
	trry{
   
		Block block1 = new Block(135456,5464,5646);
		....
		ByteOutputStream bout = new ByteOutputStream();
		DateOutputStream dout = new DateOutputStream();
		block1.wirte(dout);//序列化到输出流dout
		dout.close();
		System.out.println(......);
		SerializationExample.print1n(out.toByteArray(),bout.size());
	}
}
hadoop的序列化结果紧凑而且快速。

1.3Hadoop序列化机制的特征

  • 紧凑
  • 快速‘
  • 可扩展
  • 互操作

1.4Hadoop Writeable机制

为支持以上特性,Hadoop提供了org.apache.hadoop.io.Writable接口,作为所有可序列对象必须实现的接口。

Writeable机制紧凑,快速,Writeable接口包含两个方法

public interface Writeable{
   	
	void write(DataOutput out)throws IOExceptionvoid readFields(DataInput in)throws IOException}

Writeable将对象状态写入二进制的DataOutput中,反序列化由readFields()从DataInput流中读取状态,例子如下;

public static Block implements Writable ,cpmparable<Block>,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值