hadoop中常见的压缩格式及特性如下:
压缩格式 | 工具 | 算法 | 文件扩展名 | 多文件 | 可分割性 |
DEFLATE* | 无 | DEFLATE | .deflate | 不 | 不 |
Gzip | gzip | DEFLATE | .gz | 不 | 不 |
ZIP | zip | DEFLATE | .zip | 是 | 是,在文件范围内 |
bzip2 | bzip2 | bzip2 | .bz2 | 不 | 是 |
LZO | lzop | LZO | .lzo | 不 | 不 |
首先hive作业结果最好使用sequencefile,因为textfile是没有压缩的。
使用sequencefile很简单,只要在建表的时候用:
stored as seqeuncefile
声明就可以。
注意如果是用create table as语句,它会读取hive-site.xml里的默认格式(默认是textfile)。
配置如下:
hadoop-site.xml配置:
mapred.output.compression.type BLOCK
io.seqfile.compressioin.type BLOCK
然后配置:
或在hive-site.xml中配置:mapred.output.compress true Should the job outputs be compressed? mapred.output.compression.codec org.apache.hadoop.io.compress.LzoCodec If the job outputs are compressed, how should they be compressed?
之后我们就可以配置输出结果的压缩方式了,默认是使用zlib,即org.apache.hadoop.io.compress.DefaultCodec。hive.exec.compress.output true Should the job outputs be compressed?
我们可以改成其他的,比如速度比较快的lzo。
需要注意的是,lzo在0.19.1中是存在的,但是在0.20之后,因为许可证问题被移除了,是需要单独安装的。
首先需要添加lzo codec,在hadoop-site.xml中添加:
io.compression.codecs org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec A list of the compression codec classes that can be used for compression/decompression.
其他的压缩配置按照上面的写就OK。
配置完以后,可以在job.xml中查看运行的作业的配置是否启用了压缩,也可以使用
hadoop fs -cat 输出结果文件 | more
来查看是否启用压缩。因为输出结果文件的文件头是标注了文件的格式的,如key和value的类名,以及是否压缩。如果启用压缩,你能看到类似下面的输出:
SEQ"org.apache.hadoop.io.BytesWritableorg.apache.hadoop.io.Text*org.apache.hadoop.io.compress.DefaultCodec...
上面讲的都是输出结果的压缩,map的中间结果也可以启用压缩,而且中间结果对输出结果是没有影响的:
hadoop-site.xml中:
mapred.compress.map.output true Should the outputs of the maps be compressed before being sent across the network. Uses SequenceFile compression. mapred.map.output.compression.codec org.apache.hadoop.io.compress.LzoCodec If the map outputs are compressed, how should they be compressed?
也可以hive-site.xml中配置:
hive.exec.compress.intermediate true Should the outputs of the maps be compressed before being sent across the network. Uses SequenceFile compression. hive.intermediate.compression.codec org.apache.hadoop.io.compress.LzoCodec If the map outputs are compressed, how should they be compressed?
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec="org.apache.hadoop.io.compress.LzoCodec";
中间结果的压缩,建议采用lzo,因为它速度比较快,不像其他压缩方式比较耗CPU。
当然,如果启用了lzo,也会有上面说的许可证的问题,要保证你的集群机器都单独安装了lzo压缩包。