为什么hive在mapper和reducer的数量设置为1的情况下还要将2个部分文件写入hdfs

iecba09b  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(342)

我有一个配置单元插入覆盖查询- set mapred.map.tasks=1; set mapred.reduce.tasks=1; insert overwrite table staging.table1 partition(dt) select * from testing.table1; 当我检查staging.table1的hdfs目录时,我看到创建了两个部件文件。

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

为什么要创建两个文件?
我使用的是beeline客户端和hive2.1.1-cdh6.3.1

ohfgkhjo

ohfgkhjo1#

这个 insert 您执行的查询是map only,这意味着没有reduce任务。所以没有设置的意义 mapred.reduce.tasks .
另外,Map器的数量由分割的数量决定,所以设置 mapred.map.tasks 不会改变Map器的平行度。
至少有两种可行的方法可以将生成的文件数强制为1:
强制执行文件合并的post作业。
hive.merge.mapfiles 是真的。嗯,默认值已经是真的了。
减少 hive.merge.smallfiles.avgsize 触发合并。
增加 hive.merge.size.per.task 合并后的目标大小足够大。
配置Map器的文件合并行为以减少Map器的数量。
确保 hive.input.format 设置为 org.apache.hadoop.hive.ql.io.CombineHiveInputFormat ,这也是默认值。
然后增加 mapreduce.input.fileinputformat.split.maxsize 允许更大的拆分大小。

相关问题