Hive表LZ4压缩可拆分特性未生效,咨询启用方法
解决Hive中LZ4压缩文件无法拆分的问题
我之前也碰到过完全一样的情况!明明LZ4宣称支持文本文件拆分,但实际查询时就是不拆文件。咱们一步步来搞定:
1. 确认压缩文件的生成方式
如果你的LZ4文件是用系统自带的lz4命令行工具压缩的,那肯定是不可拆分的——因为Hadoop的可拆分LZ4压缩需要在文件中存储块索引信息,而普通命令行压缩的文件没有这个结构。这种情况下,你需要重新通过Hive写入数据,让Hive用Hadoop原生的LZ4 codec生成可拆分的文件:
-- 先开启会话级压缩配置 set hive.exec.compress.output=true; set mapreduce.output.fileoutputformat.compress=true; set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.Lz4Codec; set mapreduce.output.fileoutputformat.compress.type=BLOCK; -- 重新插入数据到目标表 INSERT OVERWRITE TABLE your_table_name SELECT * FROM your_source_table;
2. 检查并修正表的存储配置
确保你的表使用的是支持拆分的输入格式和压缩配置:
方式一:修改现有表的属性
ALTER TABLE your_table_name SET FILEFORMAT TEXTFILE; -- 文本文件格式是前提,配合可拆分压缩codec ALTER TABLE your_table_name SET TBLPROPERTIES ( 'mapreduce.input.fileinputformat.split.minsize'='134217728', -- 设置拆分最小单位(比如128M) 'mapreduce.input.fileinputformat.split.maxsize'='536870912' -- 设置拆分最大单位(比如512M) );
方式二:新建表时直接配置正确
CREATE TABLE your_table_name ( -- 你的表字段定义 ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE TBLPROPERTIES ( 'mapreduce.input.fileinputformat.split.minsize'='134217728', 'mapreduce.input.fileinputformat.split.maxsize'='536870912' );
3. 验证Hadoop/Hive版本兼容性
Hadoop从2.3版本开始才支持可拆分的LZ4压缩,Hive则需要0.13及以上版本才能正确识别和使用这个特性。如果你的版本低于这个范围,建议升级,或者手动添加对应的codec配置到hive-site.xml:
<property> <name>hive.exec.compress.output</name> <value>true</value> </property> <property> <name>mapreduce.output.fileoutputformat.compress.codec</name> <value>org.apache.hadoop.io.compress.Lz4Codec</value> </property> <property> <name>mapreduce.output.fileoutputformat.compress.type</name> <value>BLOCK</value> </property>
4. 验证拆分是否生效
重新执行SELECT COUNT(1) FROM your_table_name;,然后查看YARN或者Hive的日志,看mapper的数量是否超过20个(比如每个15G的文件拆分成多个mapper,取决于你设置的split大小)。也可以用Hadoop命令查看文件的可拆分属性:
hdfs fsck /path/to/your/table/directory -files -blocks
如果每个LZ4文件被分成了多个block,说明拆分已经生效。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

