Hive应用(5.1)文件格式及压缩

对于I/O密集型的job来说,使用压缩可以有效的提高IO和网络的吞吐量,对于CPU密集型的job则有可能会降低性能。

1. 压缩编码选择

可以使用如下命令查看当前hive中安装的压缩编解码器

1
2
3
set io.compression.codecs

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.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec
编码 压缩后大小 压缩速度 是否可分割
GzipCodec
BZip2Codec
DeflateCodec(default)
SnappyCodec
Lz4Codec

2.中间压缩

开启中间压缩可以减少mapper和reducer之间传输的数据量,中间压缩优先选择速度快、资源消耗低的方式

1
2
3
4
5
6
7
8
9
10
11
<!-- 开启中间压缩 -->
<property>
<name>hive.exec.compress.intermediate</name>
<value>true</value>
</property>

<!-- 指定压缩算法 -->
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>

3.输出结果压缩

可以对hive写入表中的数据进行压缩

1
2
3
4
5
6
7
8
9
10
11
<!-- 开启结果压缩 -->
<property>
<name>hive.exec.compress.output</name>
<value>true</value>
</property>

<!-- 指定压缩算法 -->
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.GzipCodec</value>
</property>

4.sequence file存储格式

上面提到的大多数压缩文件都是不可分割的,而文本文件可以自由分割并由多个mapper并行处理。为了改善这个问题,Hadoop支持sequence file存储格式,可以将文件切分成多个块,然后进行压缩。

1
CREATE TABLE users (...) STORED AS SEQUENCEFILE; --使用sequence file格式

sequence file有3种压缩方式:

  1. NONE:不压缩
  2. RECORD(default): 按记录压缩
  3. BLOCK:按块压缩
1
2
3
4
<property>
<name>mapreduce.output.fileoutputformat.compress.type</name>
<value>BLOCK</value>
</property>

5.存档分区

如果一个分区文件较多,但是又不常用时,可以将该分区设置为存档分区。存档分区将把所有文件合并成一个大.har文件,可以降低NameNode压力,还可以提供对该分区低效率的访问。

1
2
3
4
SET hive.archive.enabled=true;
ALTER TABLE users ARCHIVE PARTITION (country = 'US') -- 修改US分区为存档分区

ALTER TABLE users UNARCHIVE PARTITION (country = 'US') -- 取消US分区为存档分区