我有一个配置单元插入覆盖查询- 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
1条答案
按热度按时间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
允许更大的拆分大小。