0%

压缩

hive压缩配置详解:提升存储与计算效率

Hive 作为基于 Hadoop 的数据仓库,其数据存储和计算依赖 HDFS 和 MapReduce/Spark 引擎。压缩技术是优化 Hive 性能的关键手段,可显著减少磁盘存储占用和网络数据传输量。本文详细讲解 Hive 压缩的配置方式、适用场景及最佳实践,帮助开发者合理启用压缩提升效率。

Hive 压缩的核心作用

Hive 处理的多为海量数据,未压缩的数据存在两大问题:

  1. 存储成本高:TB 级数据占用大量 HDFS 存储空间;
  2. 计算效率低:MapReduce/Spark 任务中,大量未压缩数据的传输和读写会消耗更多网络带宽和 I/O 资源。

压缩的核心价值

  • 减少存储占用(压缩比通常为 3:1~5:1);
  • 降低网络传输量,加速 Map 与 Reduce 阶段的数据交换;
  • 减少磁盘 I/O 次数,提升任务执行速度。

Hive 压缩的两个关键阶段

Hive 的压缩配置需区分 Map 输出阶段Reduce 输出阶段,两者适用场景和配置参数不同。

1. Map 输出阶段压缩(中间数据压缩)

Map 阶段的输出数据(Map 结果)会作为 Reduce 阶段的输入,若数据量大,传输耗时占比极高。启用 Map 输出压缩可减少传输数据量,加速 Reduce 阶段。

配置参数及说明
参数 作用 默认值 推荐配置
hive.exec.compress.intermediate 启用 Hive 中间数据压缩 false true(开启)
mapreduce.map.output.compress 启用 MapReduce Map 输出压缩 true 保持 true
mapreduce.map.output.compress.codec Map 输出压缩算法 org.apache.hadoop.io.compress.DefaultCodec 推荐 org.apache.hadoop.io.compress.SnappyCodec(平衡速度与压缩比)
配置步骤

在 Hive 客户端或 hive-site.xml 中设置:

1
2
3
4
5
-- 开启 Hive 中间数据压缩  
set hive.exec.compress.intermediate=true;

-- 配置 Map 输出压缩算法为 Snappy(需集群支持 Snappy)
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

2. Reduce 输出阶段压缩(最终数据压缩)

Reduce 阶段的输出是最终写入 HDFS 的数据(如 INSERT 语句的结果表)。启用 Reduce 输出压缩可减少长期存储占用,尤其适合大表的结果保存。

配置参数及说明
参数 作用 默认值 推荐配置
hive.exec.compress.output 启用 Hive 最终输出数据压缩 false true(开启)
mapreduce.output.fileoutputformat.compress 启用 MapReduce 最终输出压缩 false true
mapreduce.output.fileoutputformat.compress.codec Reduce 输出压缩算法 org.apache.hadoop.io.compress.DefaultCodec 推荐 org.apache.hadoop.io.compress.SnappyCodecorg.apache.hadoop.io.compress.GzipCodec
mapreduce.output.fileoutputformat.compress.type 压缩类型(块压缩 / 行压缩) RECORD(行压缩) BLOCK(块压缩,压缩比更高)
配置步骤
1
2
3
4
5
6
7
8
9
10
11
-- 开启 Hive 最终输出压缩  
set hive.exec.compress.output=true;

-- 启用 MapReduce 最终输出压缩
set mapreduce.output.fileoutputformat.compress=true;

-- 配置压缩算法为 Snappy
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

-- 启用块压缩(比行压缩更高效)
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

常用压缩算法对比与选型

Hadoop 支持多种压缩算法,需根据场景选择平衡压缩比、速度和兼容性的算法:

压缩算法 压缩比 压缩速度 解压速度 是否可分割 适用场景
Snappy 中(~2.5:1) Map 输出(中间数据,优先速度)
Gzip 高(~3:1) Reduce 输出(最终存储,优先压缩比)
LZO 中(~2.1:1) 是(需索引) 大文件存储(支持分割,适合 MapReduce 并行处理)
BZIP2 极高(~4:1) 归档数据(不常访问,优先压缩比)

选型建议

  • Map 输出阶段:优先 Snappy(速度最快,减少中间传输耗时);
  • Reduce 输出阶段
    • 频繁查询的热数据:用 Snappy(平衡速度与存储);
    • 归档冷数据:用 GzipBZIP2(更高压缩比,降低存储成本);
    • 超大文件(>1GB):用 LZO(支持分割,避免单文件 Map 任务瓶颈)。

压缩配置验证与效果查看

验证压缩是否生效

执行 Hive SQL 任务后,通过以下方式确认压缩配置生效:

查看输出文件后缀
  • Snappy 压缩文件无固定后缀,但可通过工具识别;
  • Gzip 压缩文件后缀为 .gz
  • LZO 压缩文件后缀为 .lzo

示例:查询表数据存储路径并检查文件:

1
2
3
4
5
6
-- 查看表存储路径  
desc formatted test_table; -- 输出:Location: hdfs://.../test_table/

-- 在 HDFS 中查看文件
hdfs dfs -ls /user/hive/warehouse/test_table/
-- 若文件大小明显减小,且无明文内容,说明压缩生效
查看任务日志

MapReduce 任务日志中会显示压缩配置:

1
2
19/10/01 10:00:00 INFO mapreduce.Job:  map output compression codec: org.apache.hadoop.io.compress.SnappyCodec  
19/10/01 10:00:05 INFO mapreduce.Job: output compression codec: org.apache.hadoop.io.compress.SnappyCodec

压缩效果对比

以 1GB 文本数据为例,不同配置的效果差异:

配置 存储大小 Map 阶段耗时 Reduce 阶段耗时
无压缩 1024MB 60s 80s
Snappy 压缩 ~400MB 50s(减少 I/O) 65s(减少传输)
Gzip 压缩 ~320MB 55s 70s

注意事项与最佳实践

1. 确保集群支持压缩算法

  • Snappy/LZO 需在所有节点安装对应的库(如 snappy-java),否则任务会报 ClassNotFoundException
  • 验证方法:执行 hadoop checknative 查看支持的本地压缩库。

2. 避免过度压缩

  • 压缩和解压会消耗 CPU 资源,小数据量(<100MB)无需压缩,反而可能增加 overhead;
  • 频繁更新的表(如每日增量更新)建议用 Snappy(减少压缩对写入性能的影响)。

3. 可分割压缩算法的优势

  • 非可分割算法(如 Gzip、Snappy)的文件无法被 MapReduce 并行处理,大文件会导致单个 Map 任务处理压力过大;
  • 若需处理大文件,优先用 LZO(需创建索引)或 BZIP2(原生支持分割)。

4. 配置持久化

临时配置(set 命令)仅在当前会话有效,需持久化到 hive-site.xml 全局生效:

1
2
3
4
5
6
7
8
9
<!-- hive-site.xml 配置示例 -->  
<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>

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10