为什么即使映射器和缩减器的数量设置为 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:
- 正在执行 post 文件合并作业。
设置 hive.merge.mapfiles
为真。嗯,默认值已经是true了。
减少 hive.merge.smallfiles.avgsize
以实际触发合并。
合并后增加 hive.merge.size.per.task
到足够大作为目标大小。
- 配置映射器的文件合并行为以减少映射器的数量。
确保 hive.input.format
设置为 org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
,这也是默认值。
然后增加 mapreduce.input.fileinputformat.split.maxsize
以允许更大的拆分大小。
我有一个配置单元插入覆盖查询 - 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:
- 正在执行 post 文件合并作业。
设置hive.merge.mapfiles
为真。嗯,默认值已经是true了。
减少hive.merge.smallfiles.avgsize
以实际触发合并。
合并后增加hive.merge.size.per.task
到足够大作为目标大小。 - 配置映射器的文件合并行为以减少映射器的数量。
确保hive.input.format
设置为org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
,这也是默认值。
然后增加mapreduce.input.fileinputformat.split.maxsize
以允许更大的拆分大小。