使用插入覆盖分区的配置单元压缩
hive compaction using insert overwrite partition
尝试通过在hadoop中插入覆盖分区命令压缩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;
输入文件:
出于测试目的,我在 HDFS 的配置单元分区 (2016/03/11) 下有三个文件,每个文件大小为 40 MB。
2016/03/11/file1.csv
2016/03/11/file2.csv
2016/03/11/file3.csv
例如我的块大小是 128 ,所以我想只创建一个输出文件。但是我得到了 3 个不同的压缩文件。
请帮我获取配置单元配置以限制输出文件大小。如果我不使用压缩,我得到的是单个文件。
蜂巢版本:1.1
有趣的是,在使用压缩时指定分区时您仍然会得到 3 个文件,因此您可能想要研究动态分区或放弃分区并关注作业创建的映射器和缩减器的数量。如果您的文件很小,我可以看到您希望将它们全部放在目标上的一个文件中,但我也会质疑是否需要对它们进行压缩。
在您的目标中创建的文件数量与缩减器或映射器的数量直接相关。如果您编写的 SQL 需要减少,那么创建的文件数量将与作业中使用的减速器数量相同。这可以通过设置作业中使用的减速器数量来控制。
set mapred.reduce.tasks = 1;
在您的示例中 SQL 很可能不会使用任何缩减程序,因此目标中的文件数量等于使用的映射器数量,即等于文件中的文件数量资源。在仅限地图的作业上控制输出文件的数量并不容易,但可以尝试许多配置设置。
设置合并小输入文件以减少生成的映射器,默认值为 false。
set hive.hadoop.supports.splittable.combineinputformat = true;
尝试为输入文件设置一个阈值(以字节为单位),低于此阈值的任何内容都会尝试转换为 map 连接,这会影响输出文件的数量。
set hive.mapjoin.smalltable.filesize = 25000000;
至于压缩,我会尝试更改正在使用的压缩类型,看看这是否会对您的输出产生任何影响。
set hive.exec.orc.default.compress = gzip, snappy, etc...
尝试通过在hadoop中插入覆盖分区命令压缩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;
输入文件:
出于测试目的,我在 HDFS 的配置单元分区 (2016/03/11) 下有三个文件,每个文件大小为 40 MB。
2016/03/11/file1.csv
2016/03/11/file2.csv
2016/03/11/file3.csv
例如我的块大小是 128 ,所以我想只创建一个输出文件。但是我得到了 3 个不同的压缩文件。
请帮我获取配置单元配置以限制输出文件大小。如果我不使用压缩,我得到的是单个文件。
蜂巢版本:1.1
有趣的是,在使用压缩时指定分区时您仍然会得到 3 个文件,因此您可能想要研究动态分区或放弃分区并关注作业创建的映射器和缩减器的数量。如果您的文件很小,我可以看到您希望将它们全部放在目标上的一个文件中,但我也会质疑是否需要对它们进行压缩。
在您的目标中创建的文件数量与缩减器或映射器的数量直接相关。如果您编写的 SQL 需要减少,那么创建的文件数量将与作业中使用的减速器数量相同。这可以通过设置作业中使用的减速器数量来控制。
set mapred.reduce.tasks = 1;
在您的示例中 SQL 很可能不会使用任何缩减程序,因此目标中的文件数量等于使用的映射器数量,即等于文件中的文件数量资源。在仅限地图的作业上控制输出文件的数量并不容易,但可以尝试许多配置设置。
设置合并小输入文件以减少生成的映射器,默认值为 false。
set hive.hadoop.supports.splittable.combineinputformat = true;
尝试为输入文件设置一个阈值(以字节为单位),低于此阈值的任何内容都会尝试转换为 map 连接,这会影响输出文件的数量。
set hive.mapjoin.smalltable.filesize = 25000000;
至于压缩,我会尝试更改正在使用的压缩类型,看看这是否会对您的输出产生任何影响。
set hive.exec.orc.default.compress = gzip, snappy, etc...