为什么即使映射器和缩减器的数量设置为 1,配置单元也会将 2 个部分文件写入 hdfs

Why is hive writing 2 part files to hdfs even though number of mappers and reducers is set to 1

我有一个配置单元插入覆盖查询 - set mapred.map.tasks=1; set mapred.reduce.tasks=1; insert overwrite table staging.table1 partition(dt) select * from testing.table1;

当我检查 staging.table1 的 HDFS 目录时,我看到创建了 2 个部分文件。

2019-12-25 02:25 /data/staging/table1/dt=2019-12-24/000000_0
2019-12-25 02:25 /data/staging/table1/dt=2019-12-24/000001_0

为什么创建了2个文件?

我使用的是beeline客户端和hive 2.1.1-cdh6.3.1

您执行的 insert 查询是 map-only,这意味着没有 reduce 任务。所以没有必要设置mapred.reduce.tasks

另外,mapper的数量是由splits的数量决定的,所以设置mapred.map.tasks不会改变mapper的并行度。

至少有两种可行的方法可以将结果文件数强制为 1:

  1. 正在执行 post 文件合并作业。
    设置 hive.merge.mapfiles 为真。嗯,默认值已经是true了。
    减少 hive.merge.smallfiles.avgsize 以实际触发合并。
    合并后增加 hive.merge.size.per.task 到足够大作为目标大小。
  2. 配置映射器的文件合并行为以减少映射器的数量。
    确保 hive.input.format 设置为 org.apache.hadoop.hive.ql.io.CombineHiveInputFormat,这也是默认值。
    然后增加 mapreduce.input.fileinputformat.split.maxsize 以允许更大的拆分大小。