序列化与大数据


对象的序列化(Serialization)用于将对象编码成一个字节流,以及从字节流中重新构建对象。“将一个对象编码成字节流”称为 序列化该对象
相反的过程称为 反序列化(Deserializing)

缓冲区

缓冲区可以简单地理解为一段内存区域。可以简单地把缓冲区理解为一段特殊的内存。某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

序列化用途:

1.作为一种持久化格式:一个对象被序列化以后,它的编码可以被存储在磁盘上,供以后反序列化用。
2.作为一种通信数据格式:序列化结果可以从一个正在运行的虚拟机,通过网络被传递到另一个虚拟机上
3.作为一种拷贝、克隆机制:将对象序列化到内存的缓存区中。然后通过反序列化,可以得到一个对已存对象进行深拷贝的新对象
在分布式数据处理中,主要使用上面提到的前两种功能:数据持久化和通信数据格式。在分析 Hadoop 的序列化机制前,先介绍一下 Java内建的序列化机。

Java内建的序列化机

Java序列化机制将对象转换为连续的byte数据,这些数据可以在日后还原为原先的对象状态,该机制还能自动处理不同操作系统上的差异,在Windows系统上序列化的 Java 对象,可以在 UNIX 系统上被重建出来,不需要担心不同机器上的数据表示方法,也不需要担心字节排列次序,如大端(big endian) 、小端(little endian )或其他细节

在 Java 中,使一个类的实例可被序列化非常简单,只需要在类声明中加入implements Serializable 接口是一个标志,不具有任何成员函数,其定义如下:

Serializable 接口是一个标志,不具有任何成员函数,其定义如下: Serializable接口没有任何方法,所以不需要对类进行修改, User 类通过声明它实现了 Serializable 接口,立即可以获得 Java 提供的序列化功能。代码如下:

由于序列化主要应用在与IO相关的一些操作上,其实现是通过一对输入/输出流来实现的。如果想对某个对象执行序列化动作,可以在某种OutputStream对象的基础上创建一个对象流 ObjectOutputStream对象,然后调用 writeObject()就可达到目的。

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

对于Java基本类型的序列化, ObjectOutputStrean提供了 write Boolean、 write Byte等方法。

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

Java的序列化机制非常“聪明”, JavaDoc中对 ObjectOutputStream的 writeObject()方法的说明是:“……这个对象的类、类签名、类的所有非暂态和非静态成员的值,以及它所有的父类都要被写入”,序列化机制会自动访问对象的父类,以保证对象内容的一致性。同时,序列化机制不仅存储对象在内存中的原始数据,还会追踪通过该对象可以到达的其他对象的内部数据,并描述所有这些对象是如何被链接起来的。对于复杂的情形,Java序列化机制也能应付。

仔细看 User的输出会发现,序列化的结果中包含了大量与类相关的信息。Java的序列过程在《 Java Object Serialization Specification》中规范,以 user为例,其结果的包含魔数( Magic Number);包含序列化格式的版本号:接下来是类的描述信息,包括类的版本ID、是否实现 writeObjecto和readobject())方法等信息,对于拥有超类的类(如 user MetaDataInfo),超类的信息也会递归地被保存下来;这些信息都写入 OutputStream对象后,接下来才是对象的数据。在这个过程中,序列化输出中保存了大量的附加信息,导致序列化结果膨胀,对于需要保存和处理大规模数据的 Hadoop来说,需要一个新的序列化机制。

Hadoop序列化机制的特征

对于处理大规模数据的 Hadoop平台,其序列化机制需要具有如下特征:

  1. 紧凑:由于带宽是 Hadoop集群中最稀缺的资源,一个紧凑的序列化机制可以充分利用数据中心的带宽。

  2. 快速:在进程间通信(包括 MapReduce过程中涉及的数据交互)时会大量使用序列化机制,因此,必须尽量减少序列化和反序列化的开销

  3. 可扩展:随着系统的发展,系统间通信的协议会升级,类的定义会发生变化,序列化机制需要支持这些升级和变化。

  4. 互操作:可以支持不同开发语言间的通信,如C++和Java间的通信。这样的通信可以通过文件(需要精心设计文件的格式)或者后面介绍的IPC机制实现。

Hadoop序列化框架

主要有4个接口,分别是Comparator(字节比较器), Comparable(对象比较), Writable(序列化), Configurable(参数配置)。

hadoop的序列化的特点是:
1、节省资源:由于带宽和存储是集群中的最宝贵的资源所以我们必须想法设法缩小传递信息的大小和存储大小,hadoop的序列化就为了更好地坐到这一点而设计的。
2、对象可重用:JDK的反序列化会不断地创建对象,这肯定会造成一定的系统开销,但是在hadoop的反序列化中,能重复的利用一个对象的readField方法来重新产生不同的对象。
3、可扩展性:当前hadoop的序列化有多中选择可以利用实现hadoop的WritableComparable接口。
也可使用开源的序列化框架protocol Buffers,Avro等框架。我们可以注意到的是hadoop2.X之后是实现一个YARN,所有应用(mapreduce,或者其他spark实时或者离线的计算框架都可以运行在YARN上),YARN还负责对资源的调度等等。YARN的序列化就是用Google开发的序列化框架protocol Buffers,proto目前支持支持三种语言C++,java,Python所以RPC这一层我们就可以利用其他语言来做文章,满足其他语言开发者的需求。
原文:https://blog.csdn.net/zhang0558/article/details/53444533

原文:https://blog.csdn.net/qq_36421826/article/details/80611163

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值