当我运行一个 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
这样它就不会把数据放进暂存文件夹了?我看不出暂存文件夹有什么意义。。。
1条答案
按热度按时间ffdz8vbo1#
除非您使用的是hdfs联合,并且已将配置单元配置为将作业的.staging*dir放在与目标dir不同的fs/命名空间上(这在默认设置下是不太可能发生的),否则您可能不希望配置单元执行distcp。问题是,hive现在所做的是将所有输出文件从.staging目录复制到最终的目标目录,而使用distcp将做同样的事情-复制-再加上为每个文件生成整个mapreduce作业的开销(这是我在Hive1.1中看到的行为),因此性能可能会差得多。唯一可能的例外是如果你的输出文件非常大。。。
但是如果你不需要的话为什么要抄?这意味着读取和重写所有文件。hdfs移动/重命名只需更改文件的元数据,几乎是即时的。
为了获得这种行为,我建议在hive-site.xml中添加以下(不幸的是没有文档记录的)属性-
如果${hive.exec.scratchdir}在您的配置单元版本中没有被自动替换,只需查找其值并在上面的值中手动替换即可。例如,如果hive中的默认值hive.exec.scratchdir>0.14,您可以将此值设置为/tmp/hive/${user.name}/.staging,而在hive<0.14中,将其设置为/tmp/hive-${user.name}/.staging(您不应该对${user.name}执行此操作,这样做并不是一个好主意,因为这些原因与此答案无关)