在hadoop中,通过insert overwrite partition命令压缩hive分区下的文件来解决小文件问题。
查询:
SET hive.exec.compress.output=true;
SET mapred.max.split.size=256000000;
SET mapred.output.compression.type=BLOCK;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=256000000;
set hive.merge.smallfiles.avgsize=256000000;
INSERT OVERWRITE TABLE tbl1 PARTITION (year=2016, month=03, day=11)
SELECT col1,col2,col3 from tbl1
WHERE year=2016 and month=03 and day=11;
输入文件:
出于测试目的,我在hive分区(2016/03/11)下有三个hdfs文件,每个文件的大小为40mb。
2016/03/11/file1.csv
2016年3月11日/file2.csv
2016年3月11日/file3.csv
例如,我的块大小是128,所以我只想创建一个输出文件。但是我得到了3个不同的压缩文件。
请帮助我获取配置单元配置以限制输出文件大小。如果我不使用压缩,我得到的是单个文件。
配置单元版本:1.1
1条答案
按热度按时间ma8fv8wu1#
有趣的是,在使用压缩时指定分区时,仍然会得到3个文件,因此您可能希望研究动态分区或放弃分区,并关注由作业创建的Map器和还原器的数量。如果您的文件很小,我可以看到您希望如何将它们都放在一个文件中,但我也会质疑是否需要对它们进行压缩。
在目标中创建的文件数直接与缩减器或Map器的数量相关。如果您编写的sql需要减少,那么创建的文件数将与作业中使用的减少器数相同。这可以通过设置作业中使用的减速器数量来控制。
在您的示例sql中,很可能没有使用任何缩减器,因此目标中的文件数等于使用的Map器数,Map器数等于源中的文件数。在一个只Map的作业上控制输出文件的数量并不是那么容易,但是有许多配置设置可以尝试。
设置为合并小的输入文件以便生成较少的Map器,默认值为false。
尝试为输入文件设置以字节为单位的阈值,低于此阈值的任何内容都将尝试转换为Map联接,这可能会影响输出文件的数量。
至于压缩,我将尝试更改所使用的压缩类型,看看这是否会对输出产生任何影响。