hive覆盖目录移动进程为distcp?

时间:2015-11-21 14:19:36

标签: hadoop hive

当我在hive中运行INSERT OVERWRITE DIRECTORY查询时,它似乎将结果存储在.hivexxxx暂存文件夹中,然后将文件从那里移动到目录...

在地图缩小过程结束时,它会显示:

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它的方法,所以它不会将数据放入该分段寄存器中?我没有看到该登台文件夹中的要点......

1 个答案:

答案 0 :(得分:4)

除非您正在使用HDFS联合,并且您已配置配置单元以将作业的.staging *目录放在与目标目录不同的FS /命名空间上(使用默认设置时不太可能发生这种情况)你可能希望hive做distcp。问题是,hive现在正在做的是它将所有输出文件从.staging dir复制到最终目标dir,并且使用distcp将执行相同的操作 - 复制 - plus 开销为每个文件生成一个完整的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版本中自动替换,只需查找其值并在上面的值中手动替换它。例如,使用Hive中的hive.exec.scratchdir的默认值&gt; 0.14,您可以将此值设置为/tmp/hive/${user.name}/.staging并在Hive&lt; 0.14,设置为/tmp/hive-${user.name}/.staging(您不应该使用$ {user.name}执行此操作,并且出于以下原因这样做并不是一个好主意这个答案的主题)