Hive高阶之数据压缩详解

一般在hadoop集群上运行一个MapReduce会有以下步骤:

input-> Map-> shuffle -> reduce -> output

如果我们采用了数据压缩,在map阶段产生的数据大小就会减少,会减少磁盘的IO,同时还能够减少网络的IO。

Linux操作系统中常见的压缩格式是bzip2、gzip、lzo、snappy这四种,这四种压缩方法的比较如下:

压缩比:bizp2>gzip>lzo(snappy) bzip2最节省空间

解压速度:lzo(snappy)>gzip>bzip2 lzo解压速度是最快的

解压速度消耗CPU资源,压缩比消耗磁盘空间,这两者要权衡一下,如果压缩比太大,那么解压速度就慢,耗费CPU就多。gzip是以.gz扩展名结尾的文件使用的压缩算法,一般开源软件的压缩包多采用这种格式。snappy是google开源出来的压缩算法,它旨在提供高速压缩速度和合理的压缩率,所以现在实际应用中多使用snappy压缩算法。之前安装的CDH集群默认使用的就是snappy压缩算法。

hadoop集群中使用压缩算法的要求有以下4点:

1.hadoop的执行job的速度的瓶颈是磁盘IO和网络IO,利用压缩可以减少这些IO;

2.压缩能够降低网络传输的数据量;

3.压缩后job整体的执行性能提升了;

4.压缩算法要能够支持可分割的。由于hadoop中的job是分Map和Reduce进行处理的,通常一个Map处理一个block,这时候就需要每个block能够单独进行压缩,这样每个job在进行任务处理的时候就可以不受影响的单独进行解压。从而不影响job执行的效率。

hadoop中有三个阶段可以用到压缩,分别是Map,Shuffle和Reduce,其中Map阶段首先对输入的数据进行压缩,然后在Map的job中进行解压并对数据进行业务处理,将结果写入磁盘的时候进行数据的压缩,Shuffle的过程中将磁盘中压缩的文件内容读取出来,然后传递给Reduce,Reduce中对数据再进行解压并做业务处理,整个过程都计算完毕后再用压缩对输出进行压缩。其数据流程可以用下图表示:

压缩的输入文件->(解压数据)->Maps->压缩输出->Spill to Disk(Shuffle)->解压输入->Reduces->压缩输出->压缩的输出文件

知道在哪个阶段可以使用压缩算法的情况下,就可以有针对性对MapReduce进行调优处理。

我们可以通过Job history查看每个job运行的时候参数配置,与压缩有关的参数如下:

mapreduce.map.output.compress和mapreduce.output.fileoutputformat.compress

可以通过下面两个参数来配置压缩算法:

mapreduce.map.output.compress.codec和mapreduce.output.fileoutputformat.compress.codec

hadoop支持多种压缩算法,常用的算法对应的类有下面两个:

org.apache.hadoop.io.compress.SnappyCodec和org.apache.hadoop.compress.lzo.LzoCodec

分别对应的是snappy和lzo压缩算法,其中在2013年之前常用lzo压缩算法,目前这经常使用snappy算法。

猜你喜欢

转载自blog.csdn.net/xjjdlut/article/details/88430194