Hadoop I/O系统介绍
看过很多Hadoop介绍或者是学习的帖子和文章,发现介绍Hadoop I/O系统的很少。很多文章都会介绍HDFS的架构和使用,还有MapReduce编程等等。尤其是在介绍Hadoop的MapReduce编程之前,首先必须了解下Hadoop的I/O知识,要不一看到IntWritable、LongWritable、Text、NullWritable等概念就有点犯晕,看到和普通的Java程序类似的MapReduce程序就觉得很难。如果这时候你知道其实IntWritable就是其他语言如Java、C++里的int类型,LongWritable就是其他语言里的long,Text类似String,NullWritable就是Null,这样你就会很轻易的明白Hadoop 的MapReduce 程序。就像在学习其他编程语言之前必须先学习数据类型一样,在学习Hadoop的MapReduce编程之前,最好先学习下Hadoop的I/O知识。这里就简要介绍Hadoop的I/O知识,就当抛砖引玉吧。
1序列化和反序列化
序列化(Serialization)就是结构化的对象转化为字节流,这样可以方便在网络上传输和写入磁盘进行永久存储(原因看完这部分后就明白了)。反序列化(deserialization)就是指将字节流转回结构化对象的逆过程。
序列化和反序列化在分布式数据处理里主要出现在进程间通行和永久存储两个应用领域。在Hadoop 系统中,系统中多个节点上的进程间通信是通过远程过程调用(romote procedure call,R PC)实现的,RPC协议将消息序列转化为二进制流后发送到远程节点,远程节点接着将二进制流反序列化为消息,所以RPC对于序列化有以下要求(也就是进程间通信对于序列化的要求):
(1)紧凑,紧凑的格式可以提高传输效率,充分利用网络带宽,要知道网络带宽是数据中心的一种非常重要的资源。
(2)快速,进程间通信是分布是系统的重要内容,所以必须减少序列化和反序列化的开销,这样可以提高整个分布式系统的性能。
(3)可扩展,通信协议为了满足一些新的需求,比如在方法调用的过程中增加新的参数,或者新的服务器系统要能够接受老客户端的旧的格式的消息,这样就需要直接引进新的协议,序列化必须满足可扩展的要求。
(4)互操作,可以支持不同语言写的客户端(比如C++、java、Python等等)与服务器交互。
前面说了序列化的目的是可以方便在网络上传输和写入磁盘进行永久存储,前面讲了进程间通信对于序列化的要求,下面来说一说数据永久存储对于序列化的要求。前面说的4个序列化的要求也是数据永久存储所要求的,存贮格式紧凑可以高效的利用存储空间,快速可以减少读写数据的额外开销,可扩张这样就可以方便的读取老格式的数据,互操作就可以满足不同的编程序言来读写永久存贮的数据。