【问题标题】:Why is hive writing 2 part files to hdfs even though number of mappers and reducers is set to 1为什么即使映射器和减速器的数量设置为 1,hive 仍将 2 个部分文件写入 hdfs
【发布时间】:2019-12-26 18:57:26
【问题描述】:

我有一个配置单元插入覆盖查询 - 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

【问题讨论】:

  • 顺便说一句,所有mapred.* 属性都已弃用

标签: hadoop hive mapreduce hdfs


【解决方案1】:

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

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

至少有两种可行的方法可以强制生成的文件数为 1:

  1. 强制执行发布作业以进行文件合并。
    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 以允许更大的拆分大小。

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 2013-11-09
    • 2019-01-31
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多