一.背景
在Hadoop中,一般存储着非常大的文件,以及在存储HDFS块或运行MapReduce任务时,Hadoop集群中节点之间的存在大量数据传输。 如果条件允许时,尽量减少文件大小,这将有助于减少存储需求以及减少网络上的数据传输。
二. Hadoop支持的压缩算法
Haodop对文件压缩均实现org.apache.hadoop.io.compress.CompressionCodec接口,所有的实现类都在org.apache.hadoop.io.compress包下
1. 压缩算法比较
有不少的压缩算法可以应用到Hadoop中,但不同压缩算法有各自的特点。
存放数据到HDFS中,可以选择指定的压缩方式,在MapReduce程序读取时,会根据扩展名自动解压。例如:如果文件扩展名为.snappy,Hadoop框架将自动使用SnappyCodec解压缩文件。
整体排序如下:
Snappy < LZ4 < LZO < GZIP < BZIP2,但压缩比越高,压缩的时间也会更长。以下是部分参考数据
2. HDFS压缩如何抉择
既然压缩能够节省空间、而且可以提升IO效率,那么能否将所有数据都以压缩格式存储在HDFS中呢?例如:bzip2,而且文件是支持切分的。
- 如果文件是不可切分的,只有一个CPU在处理所有的文件,其他的CPU都是空闲的。如果HDFS中的block和文件大小差不多还好,一个文件、一个块、一个CPU。如果是一个很大的文件就会出现问题了
- bzip2在压缩和解压缩数据方面实际上平均比Gzip差3倍,这对性能是有一定的影响的。如果我们需要频繁地查询数据,数据压缩一定会影响查询效率
- 如果不关心查询性能(没有任何SLA)并且很少选择此数据,则bzip2可能是不错的选择。最好是对自己的数据进行基准测试,然后再做决定。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。