常见的压缩有:对中间结果压缩、对输出结果压缩。
压缩对比:
算法 | 压缩前/压缩后 | 压缩速度 | 解压速度 |
GZIP | 13.4% | 21MB/s | 118 MB/s |
LZO | 20.5% | 135 MB/s | 410 MB/s |
Snappy | 22.2% | 172 MB/s | 409 MB/s |
Snappy介绍:
Snappy 网站:http://code.google.com/p/snappy/
Snappy的前身是Zippy。虽然只是一个数据压缩库,它却被Google用于许多内部项目程,其中就包括BigTable,MapReduce和RPC。Google宣称它在这个库本身及其算法做了数据处理速度上的优化,作为代价,并没有考虑输出大小以及和其他类似工具的兼容性问题。Snappy特地为64位x86处理器做了优化,在单个Intel Core i7处理器内核上能够达到至少每秒250MB的压缩速率和每秒500MB的解压速率。
如果允许损失一些压缩率的话,那么可以达到更高的压缩速度,虽然生成的压缩文件可能会比其他库的要大上20%至100%,但是,相比其他的压缩库,Snappy却能够在特定的压缩率下拥有惊人的压缩速度,“压缩普通文本文件的速度是其他库的1.5-1.7倍,HTML能达到2-4倍,但是对于JPEG、PNG以及其他的已压缩的数据,压缩速度不会有明显改善”。
压缩技术集成:
snappy-java-1.0.4.1.jar集成在:hadoop-2.0.0-cdh4.5.0\share\hadoop\各个子项目\lib下
core-site.xml
配置需要使用的压缩类,多个使用逗号隔开;此处多配置了几个实现类。
<property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Cod ec,org.apache.hadoop.io.compress.DeflateCodec, org.apache.hadoop.io.compress.SnappyCodec</value> </property>
mapred-site.xml
<!--reduce阶段都有效--> <property> <name>mapred.output.compression.codec</name> <value>org.apache.hadoop.io.compress.DefaultCodec</value> </property> <!--map阶段都有效--> <property> <name>mapred.map.output.compression.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> </property> <!--map阶段是否压缩--> <property> <name>mapred.compress.map.output</name> <value>true</value> </property> <!--reduce阶段是否压缩--> <property> <name>mapred.output.compress</name> <value>false</value> </property> <property> <name>mapred.output.compression.type</name> <value>BLOCK</value> </property>
为什么有时只选择压缩map输出?
提高map到reduce之间传输数据的性能;
此种配置下,存在reduce上的数据就没有压缩的,即存放在HDFS上的数据是没有压缩的;
正常情况下:reduce也是需要压缩的
如上的配置文件:既对hadoop有效,也对hive有效。
在生产环境中建议map和reduce端都进行压缩。
如何设置只针对hive有效(针对单个窗口有效或者是配置到hive-site.xml中整体有效):
SET hive.exec.compress.output=true; SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; SET mapred.output.compression.type=BLOCK;
Hive架构层面优化之七压缩