hive中间结果和结果的压缩

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)。


sequencefile有三种压缩方式:NONE, RECORD, BLOCK。默认是启用RECORD级的压缩的,这种方式的压缩率是非常低的。因此建议开启BLOCK压缩。

配置如下:

hadoop-site.xml配置:


  mapred.output.compression.type
  BLOCK
   


  io.seqfile.compressioin.type
  BLOCK
   

然后配置:


  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?
  
或在hive-site.xml中配置:

  hive.exec.compress.output
  true
  Should the job outputs be compressed?
  
之后我们就可以配置输出结果的压缩方式了,默认是使用zlib,即org.apache.hadoop.io.compress.DefaultCodec。

我们可以改成其他的,比如速度比较快的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?
  

或者直接在HIVE脚本中写:

set hive.exec.compress.intermediate=true;

set hive.intermediate.compression.codec="org.apache.hadoop.io.compress.LzoCodec";

中间结果的压缩,建议采用lzo,因为它速度比较快,不像其他压缩方式比较耗CPU。

当然,如果启用了lzo,也会有上面说的许可证的问题,要保证你的集群机器都单独安装了lzo压缩包。



你可能感兴趣的:(Hadoop)