2012-02-14 93 views
3

我有一個Hadoop 0.20.2羣集。Hadoop DistributedCache類路徑

我想用DistributedCache的工作代碼分發到所有節點。我不明白addFileToClassPath()addArchiveToClassPath()之間的區別。從邏輯上講,前者似乎是用於單個類文件,後者用於jar。但就在的javadoc,他們有這樣的例子代碼:

DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job); 
+0

你爲什麼要這麼做?當你用'hadoop jar ......'提交作業時,它會自動發送'.jar'文件。 – 2012-02-14 08:18:33

+1

@orangeoctopus - 在我們的例子中,這將會非常低效。我有很多庫的依賴,所以這個jar會很大。每次我開始工作時,我都不想把整個事情通過網絡發送給每個從屬節點。 – 2012-02-14 12:15:57

+2

分佈式緩存也將這樣做。它不會永久地推出該文件,它是一個緩存,所以它會隨着時間的推移而被刷新。通常情況下,人們通過在所有節點上安裝庫並將其添加到類路徑中來實現此目的,而無需Hadoop API的幫助。在製作中,人們爲此使用了像Puppet這樣的東西。 – 2012-02-14 16:16:36

回答

2

question可幫助

在評論部分中提到的用戶之一,有一個與addArchiveToClassPath()相關的錯誤。學習和解決問題的最好辦法是通過更新您的Hadoop 1.0.0

From the apache website:

addArchiveToClassPath添加存檔路徑添加到當前設置CLASSPATH條目。它也將檔案添加到緩存中。歸檔文件將被解壓縮並在分發時添加到類路徑中。

addFileToClassPath添加文件路徑到當前的一組類路徑條目的它增加了緩存的文件了。在添加到類路徑中時,使用此方法添加的文件不會被解壓縮爲。要將檔案添加到classpath,請改用addArchiveToClassPath(Path)方法。

我已經意識到,Hadoop的文件是由人誰不知道英語語法寫得很好。我明白你爲什麼感到沮喪。

+1

這是相關的,我不知道它解釋了爲什麼「文件」和「存檔」版本是不同的。 – 2013-03-31 10:31:45

+0

@SeanOwen編輯該問題的更多解釋。感謝您通知我。 – shnisaka 2013-03-31 17:32:35

0

更新Hadoop是並不總是可行的 - 因爲有人建議,在這種情況下,它是有道理的,只是包裝這個瓶子與瓶子的MR工作,甚至一個大的JAR不太可能顯著影響性能。

此外,如果jar包含您提交作業的代碼,則無需將其添加到DistributedCache中,將作業提交給hadoop意味着Hadoop作業運行器將負責將jar分發給所有人運行映射器或縮減器的節點。僅當您需要一些外部數據才能與作業一起時,才需要將文件添加到DistributedCache。

+0

同樣,這是完全正確的,但沒有得到我最初感興趣的「文件」與「歸檔」方法的區別。 – 2013-03-31 10:32:39

0

我發現了一些額外的信息後,看着源頭,發現「文件」的方法複製一個本地文件到一個HDFS文件,但「歸檔」版本解壓壓縮本地存檔到HDFS。這是不同的。

在一個相關的說明,回答「何必呢?」評論 - 我有一個相對較大的JAR文件(20MB),並且會使用相同的代碼連續運行大約20個M/R作業。它是迭代的。這節省了一筆不小的數據傳輸量,以便上傳代碼一次。