2015-11-21 29 views
2

當我運行在蜂巢的INSERT OVERWRITE DIRECTORY查詢時,它似乎存儲在.hivexxxx暫存文件夾中的結果,然後將文件移動從那裏到目錄...配置單元覆蓋目錄移動進程爲distcp?

在地圖的最後降低的過程,它顯示這樣的:

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蜂巢期間過程中使用DistCp使用或者是有辦法set這麼它沒有將數據放入該分段組合器中?我沒有看到該臨時文件夾中的點...

回答

4

除非您使用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}來做到這一點,並且這樣做不是一個好主意,因爲這個答案是脫離主題的原因)

+0

噢,另一件事 - 如果你不想將.staging-hive目錄放在/ tmp下,你也可以將hive.exec.stagingdir設置爲其他的東西,比如/user/${user.name}/。如果你想強制用戶家庭配額的配額,這可能更可取... – Hercynium

+0

另請參閱此Hive JIRA門票:https://issues.apache.org/jira/browse/HIVE-11940 – Hercynium