hive中间结果和结果的压缩

hadoop中常见的压缩格式及特性如下:

压缩格式工具算法文件扩展名多文件可分割性
DEFLATE*DEFLATE.deflate
GzipgzipDEFLATE.gz
ZIPzipDEFLATE.zip是,在文件范围内
bzip2bzip2bzip2.bz2
LZOlzopLZO.lzo

首先hive作业结果最好使用sequencefile,因为textfile是没有压缩的。

使用sequencefile很简单,只要在建表的时候用:

stored as seqeuncefile

声明就可以。

注意如果是用create table as语句,它会读取hive-site.xml里的默认格式(默认是textfile)。


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

配置如下:

hadoop-site.xml配置:

<property>
  <name>mapred.output.compression.type</name>
  <value>BLOCK</value>
  <description> </description>
</property>

<property>
  <name>io.seqfile.compressioin.type</name>
  <value>BLOCK</value>
  <description> </description>
</property>

然后配置:

<property>
  <name>mapred.output.compress</name>
  <value>true</value>
  <description>Should the job outputs be compressed?
  </description>
</property>
<property>
  <name>mapred.output.compression.codec</name>
  <value>org.apache.hadoop.io.compress.LzoCodec</value>
  <description>If the job outputs are compressed, how should they be compressed?
  </description>
</property>
或在hive-site.xml中配置:
<property>
  <name>hive.exec.compress.output</name>
  <value>true</value>
  <description>Should the job outputs be compressed?
  </description>
</property>
之后我们就可以配置输出结果的压缩方式了,默认是使用zlib,即org.apache.hadoop.io.compress.DefaultCodec。

我们可以改成其他的,比如速度比较快的lzo。

需要注意的是,lzo在0.19.1中是存在的,但是在0.20之后,因为许可证问题被移除了,是需要单独安装的。

首先需要添加lzo codec,在hadoop-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.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec</value>
  <description>A list of the compression codec classes that can be used
               for compression/decompression.</description>
</property>

其他的压缩配置按照上面的写就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中:

<property>
  <name>mapred.compress.map.output</name>
  <value>true</value>
  <description>Should the outputs of the maps be compressed before being
               sent across the network. Uses SequenceFile compression.
  </description>
</property>
<property>
  <name>mapred.map.output.compression.codec</name>
  <value>org.apache.hadoop.io.compress.LzoCodec</value>
  <description>If the map outputs are compressed, how should they be
               compressed?
  </description>
</property>

也可以hive-site.xml中配置:

<property>
  <name>hive.exec.compress.intermediate</name>
  <value>true</value>
  <description>Should the outputs of the maps be compressed before being
               sent across the network. Uses SequenceFile compression.
  </description>
</property>
<property>
  <name>hive.intermediate.compression.codec</name>
  <value>org.apache.hadoop.io.compress.LzoCodec</value>
  <description>If the map outputs are compressed, how should they be
               compressed?
  </description>
</property>

或者直接在HIVE脚本中写:

set hive.exec.compress.intermediate=true;

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

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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值