Hadoop 配置单元是否将目录移动过程覆盖为distcp?

Hadoop 配置单元是否将目录移动过程覆盖为distcp?,hadoop,hive,Hadoop,Hive,当我在配置单元中运行插入覆盖目录查询时,它似乎将结果存储在.hivexxxx暂存文件夹中,然后将文件从那里移动到目录 在map reduce过程的末尾,它显示了以下内容: Moving data to: hdfs://nameservice1/user/events/Click2/.hive-staging_hive_2015-11-21_08-32-49_909_6034680686432863037-1/-ext-10000 Moving data to: /user/events/Clic

当我在配置单元中运行插入覆盖目录查询时,它似乎将结果存储在.hivexxxx暂存文件夹中,然后将文件从那里移动到目录

在map reduce过程的末尾,它显示了以下内容:

Moving data to: hdfs://nameservice1/user/events/Click2/.hive-staging_hive_2015-11-21_08-32-49_909_6034680686432863037-1/-ext-10000
Moving data to: /user/events/Click2
这个移动过程运行非常慢,似乎没有使用distcp


有没有办法将配置单元设置为在该过程中使用distcp,或者有没有办法将其设置为不将数据放入该暂存文件夹?我看不出暂存文件夹有什么意义…

除非您正在使用HDFS federation,并且您已将配置单元配置为将作业的.staging*dir放在与目标目录不同的FS/命名空间上,这在默认设置下是不可能发生的,您可能不希望配置单元执行distcp。问题是hive现在所做的是将所有输出文件从.staging目录复制到最终目标目录,使用distcp也会做同样的事情-复制-再加上为每个文件生成整个mapreduce作业的开销,这是我在hive 1.1中看到的行为,因此性能可能会更差。唯一可能的例外是,如果您的输出文件非常大

但是如果你不需要,为什么要复制呢?这意味着读取和重新写入所有文件。HDFS移动/重命名只需更改文件的元数据,几乎是即时的

为了获得这种行为,我建议将以下不幸的未记录属性添加到您的hive-site.xml中-

<property>
    <name>hive.exec.stagingdir</name>
    <value>${hive.exec.scratchdir}/${user.name}/.staging</value>
    <description>
      In Hive >= 0.14, set to ${hive.exec.scratchdir}/${user.name}/.staging
      In Hive < 0.14, set to ${hive.exec.scratchdir}/.staging

      You may need to manually create and/or set appropriate permissions on
      the parent dirs ahead of time.
    </description>
</property>

如果${hive.exec.scratchdir}在您的配置单元版本中没有被自动替换,只需查找其值并在上面的值中手动替换即可。例如,在hive>0.14中,使用默认值hive.exec.scratchdir,您可以将此值设置为/tmp/hive/${user.name}/.staging,在hive<0.14中,设置为/tmp/hive-${user.name}/.staging,您不必使用${user.name}执行此操作,而且这样做不是一个好主意,原因与此答案无关,还有一件事-如果您不想将.staging配置单元目录放在/tmp下,您还可以将hive.exec.stagingdir设置为其他内容,如/user/${user.name}/.hive staging,如果您想在用户主目录上强制执行配额,这可能更可取。。。