hadoop的序列化和压缩

  一、java对象的序列化:

    java可以通过实现Serializable接口来序列化一个对象。把一个对象进行序列化有几个好处,其一在于,对于一些不明确的类对象我们通过序列化把类保存起来,既可由本地的进程使用,也可以发送给网络上的一台计算机使用。远程计算机通过反序列化进而从一串字节中把活的对象给解析出来,从而复活对象。

   术语:

    持久化:将对象序列化存储到文件;

    数据通信:将对象序列化发送到远程计算机;

  java序列化机制的局限性:

    计算量开销大,序列化的结果体积庞大,有时能达到对象大小的数倍甚至十倍。他的引用机制也会导致大文件不能分割的问题。这些局限对于hadoop是不合适的。所以,hadoop实现了自己的序列化机制。

  二、hadoop的序列化接口:

    Writable接口:也就是org.apache.hadoop.io.Writable接口。hadoop的所有可序列化对象都必须实现这个接口。Writable接口有两个方法,一个是write方法,将对象写入字节流,另一个是readFields方法,从字节流解析出对象。

    Java的API提供了Comparable接口,也就是java.lang.Comparable接口,这个接口只有一个方法,就是compareTo,用于比较两个对象。

    WritableComparable接口同时继承了Writable和Comparable这两个接口。

    Hadoop里的三个IntWritable、DoubleWritable和ByteWritable都继承了WritableComparable接口。

  三、hadoop的压缩

    hadoop 中有两个地方要使用到压缩,第一:在HDFS上存储数据文件,压缩之后数据体积更小,有利于存储;第二,集群间的通信需要压缩数据,这样可以提高网络带宽的利用率。

    如果用MapReduce算法处理压缩文件,要求压缩算法能支持文件分割,因为MapReduce的过程需要将文件分割成多个切片。如果压缩算法不支持文件分割,那就不能做切片了。

    Java中,一切输入输出都用流的方式进行,可以读取字节序列的对象叫输入流,文件,网络连接,内存区域都可以是输入流。一个可以写入字节序列的对象叫输出流。文件,网络连接,内存区域都可以是输出流。

    假设hadoop的输入流是A,输出流是B.做压缩的话,先选择压缩算法,然后根据压缩算法创建相应的压缩器,然后用压缩器和输出流B创建压缩输出流C,最后将数据从输入流A复制到压缩输出流C即可进行压缩并输出结果。/********/如果是解压缩,先选择解压缩算法,然后根据解压缩算法创建相应的解压缩器,然后用解压缩器和输入流A创建压缩输入流C,最后将数据从输入流C复制到输出流B即可进行解压缩并输出结果。

posted @ 2013-12-26 16:58  hadoop在云端  阅读(942)  评论(0编辑  收藏  举报