2013-07-03 18 views
0

我有一個MapReduce作業,它由包含多行記錄的單個輸入文件組成。每個記錄需要時間的相當數量的時間進行處理。因此,我的輸入文件(儘管其大小可能是遠小於HDFS塊大小)在單個節點上執行時需要大量時間。在節點之間均勻分配重量級任務

如何告訴Hadoop在節點之間均勻有效地分割輸入文件?這樣即使輸入文件很小,它仍然被分成幾個並行執行的任務。

另外,我們可以告訴hadoop將文件拆分成N個任務,其中N是可用節點的數量?

謝謝!

編輯: 爲了更加清晰,我想要做的是類似於以下內容。我有很多大文件。我有一個外部程序將處理每個文件。每個文件都需要大量時間來處理。

因此,我將文件的文件名存儲在輸入文件中,然後我希望Hadoop均勻地分割它。然後在映射器中,我將與ID對應的文件複製到本地計算機並調用程序。

回答

0

這個多少錢fair amount of time?看起來你誤解了Hadoop。當您啓動MR作業時,會有一些初始延遲。這是一個mustunavoidable,無論您的數據是1KB還是1TB。這種延遲是由於像初始化,分割,地圖創建等東西而引起的。它不是因爲你的文件有多條記錄。並處理文件的大小far less than HDFS block size是不會給你任何加。坦率地說,這是對Hadoop的低效使用。

您不必告訴Hadoop什麼。該平臺足夠智能,可以分割文件以獲得最大效率。如果你有一個小於塊的文件,並且你還在分割它,那麼你將進一步降低性能。

您可以告訴Hadoop將文件拆分爲N部件,但這並不簡單。您必須擴展API並編寫您自己的自定義InputFormat以實現此目的,因爲分割輸入是InputFormat的職責。

但在做這些之前,我建議你閱讀一些關於Hadoop的更多內容。另外,請通過這個帖子: http://blog.cloudera.com/blog/2009/02/the-small-files-problem/


在回答你的最後的評論:

如果我理解正確的話,您使用的MR分割保存在「輸入文件名」的文件並將該文件複製到本地FS。你是否真的獲得了這種方法的主要優勢?我的意思是MR在與HDFS等分佈式存儲系統一起使用時顯示出它的強大功能。此外,當您使用MR複製該大文件時,您將丟失數據排序並可能最終導致錯誤的結果。恕我直言,你最好將這些文件保存在本地FS本身,並使用簡單的Java程序拆分包含名稱的文件。我沒有看到使用Hadoop just as a store的任何一點。

+0

對不起,我的意思是「每個記錄**需要**相當長的時間才能處理」。所以基本上每個記錄都是存儲在其他地方的「某些東西」的ID,處理這個「東西」需要很長時間。我想要有效地並行處理所有「事物」,因此是問題。 – fushar

+1

所以你可以用它的ID來聚合這些「東西」並將它們存儲在HDFS上,這會給你一個更大的文件,Hadoop知道如何處理大文件 – darkjh

+0

我同意@darkjh。但是,爲了讓自己清楚,爲什麼當你的實際目標是處理與該記錄(ID)相關的「某事」時,你擔心「記錄(ID)」? – Tariq

0

您可以像下面

conf.setNumMapTasks(10); 
    conf.setNumReduceTasks(5); 

您還可以根據使用mapred.max.split.size財產您的需要改變輸入分配大小設置的映射,與減速器任務數爲您的工作。

+0

謝謝,我按照建議調整'mapred.max.split.size'。 – fushar