除非您使用HDFS聯合身份驗證,並且您已配置配置單元以將.staging *目錄放置在與目標不同的FS /名稱空間上的作業目錄,(這是非常不可能發生的默認設置)你可能不要想要配置單元做distcp。問題在於現在的配置單元正在將所有輸出文件從.staging目錄複製到最終目標目錄,並且使用distcp將執行同樣的操作 - 複製 - 生成整個映射的簡化的開銷 - 加上每個文件(這是我在Hive 1.1中看到的行爲)的作業,所以性能可能會更差更。唯一可能的例外是,如果你的輸出文件是瘋狂大...
但是,如果你不需要複製?這意味着閱讀和重寫所有文件。 HDFS移動/重命名只是簡單地改變文件的元數據,並且幾乎是即時的。
要獲得這種行爲,我建議增加以下(不幸的是無證)屬性的蜂房的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> 0.14中的hive.exec.scratchdir的默認值,您可以將此值設置爲/tmp/hive/${user.name}/.staging,並在Hive < 0.14中設置爲/ tmp/hive - $ {user.name} /。staging(你不應該用$ {user.name}來做到這一點,並且這樣做不是一個好主意,因爲這個答案是脫離主題的原因)
噢,另一件事 - 如果你不想將.staging-hive目錄放在/ tmp下,你也可以將hive.exec.stagingdir設置爲其他的東西,比如/user/${user.name}/。如果你想強制用戶家庭配額的配額,這可能更可取... – Hercynium
另請參閱此Hive JIRA門票:https://issues.apache.org/jira/browse/HIVE-11940 – Hercynium