一.背景

在Hadoop中,一般存储着非常大的文件,以及在存储HDFS块或运行MapReduce任务时,Hadoop集群中节点之间的存在大量数据传输。 如果条件允许时,尽量减少文件大小,这将有助于减少存储需求以及减少网络上的数据传输。

二. Hadoop支持的压缩算法

Haodop对文件压缩均实现org.apache.hadoop.io.compress.CompressionCodec接口,所有的实现类都在org.apache.hadoop.io.compress包下
image.png

1. 压缩算法比较

有不少的压缩算法可以应用到Hadoop中,但不同压缩算法有各自的特点。
image.png
存放数据到HDFS中,可以选择指定的压缩方式,在MapReduce程序读取时,会根据扩展名自动解压。例如:如果文件扩展名为.snappy,Hadoop框架将自动使用SnappyCodec解压缩文件。
image.png
整体排序如下:
Snappy < LZ4 < LZO < GZIP < BZIP2,但压缩比越高,压缩的时间也会更长。以下是部分参考数据
image.png

2. HDFS压缩如何抉择

既然压缩能够节省空间、而且可以提升IO效率,那么能否将所有数据都以压缩格式存储在HDFS中呢?例如:bzip2,而且文件是支持切分的。

  • 如果文件是不可切分的,只有一个CPU在处理所有的文件,其他的CPU都是空闲的。如果HDFS中的block和文件大小差不多还好,一个文件、一个块、一个CPU。如果是一个很大的文件就会出现问题了
  • bzip2在压缩和解压缩数据方面实际上平均比Gzip差3倍,这对性能是有一定的影响的。如果我们需要频繁地查询数据,数据压缩一定会影响查询效率
  • 如果不关心查询性能(没有任何SLA)并且很少选择此数据,则bzip2可能是不错的选择。最好是对自己的数据进行基准测试,然后再做决定。

捕风
47 声望16 粉丝