hive on tez如何设置写hdfs的数据文件为gz压缩
在 Hive on Tez 中设置写入 HDFS 的数据文件为 GZIP 压缩,需通过配置 Hive 会话参数和表属性实现。以下是具体步骤及方法:
1. 开启 Hive 输出压缩功能
在 Hive 会话中启用最终输出压缩,并指定 GZIP 压缩格式:
-- 开启 Hive 最终输出压缩
SET hive.exec.compress.output = true;
-- 设置 MapReduce 输出压缩为 GZIP
SET mapreduce.output.fileoutputformat.compress = true;
SET mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.GzipCodec;
SET mapreduce.output.fileoutputformat.compress.type = BLOCK; -- 块压缩(默认行压缩,BLOCK 压缩率更高)
这些参数会作用于当前会话的所有输出操作。
2. 创建表时指定压缩格式(可选)
若需表默认以 GZIP 压缩存储数据,可在建表语句中通过 TBLPROPERTIES
声明:
CREATE TABLE example_table (
id INT,
name STRING
) STORED AS TEXTFILE -- 存储格式需支持压缩(如 TEXTFILE、SEQUENCEFILE 等)
TBLPROPERTIES (
'compression' = 'GZIP' -- 指定压缩算法为 GZIP
);
此配置会确保该表的所有写入操作自动应用 GZIP 压缩。
3. 插入数据时动态启用压缩
即使表未预设压缩属性,也可在 INSERT
语句中临时启用 GZIP 压缩:
-- 动态设置压缩参数(覆盖会话默认值)
SET mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.GzipCodec;
-- 执行数据写入
INSERT OVERWRITE TABLE example_table
SELECT id, name FROM source_table;
此方式灵活适用于临时性压缩需求。
4. 验证压缩效果
写入完成后,可通过 HDFS 命令检查文件是否为 .gz
格式:
hdfs dfs -ls /user/hive/warehouse/example_table
输出文件应显示类似 000000_0.gz
的命名,表明压缩成功。
注意事项
• 存储格式兼容性:GZIP 压缩适用于 TEXTFILE
、SEQUENCEFILE
等格式,但 ORC
/PARQUET
列式存储格式通常内置更高效的压缩算法(如 ZLIB),建议优先使用列式存储。
• 性能权衡:GZIP 压缩率高但 CPU 开销较大,适合冷数据存储;若需更高性能,可考虑 Snappy(压缩率略低但速度快)。
• 小文件合并:若输出产生过多小文件,需结合 hive.merge
参数合并(如 hive.merge.size.per.task
)以避免 HDFS 存储效率下降。
通过上述配置,可有效将 Hive on Tez 的 HDFS 输出文件压缩为 GZIP 格式,平衡存储成本与查询性能。