当我在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
它的方法,所以它不会将数据放入该分段寄存器中?我没有看到该登台文件夹中的要点......
答案 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}执行此操作,并且出于以下原因这样做并不是一个好主意这个答案的主题)