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

bhmjp9jg  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(329)

当我运行一个 INSERT OVERWRITE DIRECTORY 在hive中查询,它似乎将结果存储在 .hivex 暂存文件夹,然后将文件从那里移动到目录。。。
在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 有没有办法 set hive在这个过程中使用distcp还是有办法 set 这样它就不会把数据放进暂存文件夹了?我看不出暂存文件夹有什么意义。。。

ffdz8vbo

ffdz8vbo1#

除非您使用的是hdfs联合,并且已将配置单元配置为将作业的.staging*dir放在与目标dir不同的fs/命名空间上(这在默认设置下是不太可能发生的),否则您可能不希望配置单元执行distcp。问题是,hive现在所做的是将所有输出文件从.staging目录复制到最终的目标目录,而使用distcp将做同样的事情-复制-再加上为每个文件生成整个mapreduce作业的开销(这是我在Hive1.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中的默认值hive.exec.scratchdir>0.14,您可以将此值设置为/tmp/hive/${user.name}/.staging,而在hive<0.14中,将其设置为/tmp/hive-${user.name}/.staging(您不应该对${user.name}执行此操作,这样做并不是一个好主意,因为这些原因与此答案无关)

相关问题