2013-10-10 28 views
3

在我的程序的地圖階段,我需要知道創建的mappers的總數。這將幫助我在地圖的關鍵創建過程中(我想爲每個對象發出與mappers數一樣多的關鍵值對)。hadoop得到實際的mappers人數

我知道設置mappers的數量只是一個提示,但獲得的實際數量是多少。 我想在我的映射器的配置方法如下:

public void configure(JobConf conf) { 
    System.out.println("map tasks: "+conf.get("mapred.map.tasks")); 
    System.out.println("tipid: "+conf.get("mapred.tip.id")); 
    System.out.println("taskpartition: "+conf.get("mapred.task.partition")); 
} 

但我得到的結果:(?)

map tasks: 1 
tipid: task_local1204340194_0001_m_000000 
taskpartition: 0 
map tasks: 1 
tipid: task_local1204340194_0001_m_000001 
taskpartition: 1 

,這意味着有兩個地圖的任務,不只是一個,打印出來(這很自然,因爲我有兩個小輸入文件)。地圖任務後的數字不應該是2嗎?

現在,我只是計算輸入文件夾中的文件數量,但這不是一個好的解決方案,因爲文件可能大於塊大小,並導致多個輸入拆分並因此導致映射器。有什麼建議麼?

+1

http://wiki.apache.org/hadoop/HowManyMapsAndReduces 這取決於你的塊大小和你的文件數量。因此,如果您想要,然後將此編號添加到您的作業的distributedCache,您實際上可以在mapreduce之外進行計算。 – DDW

+0

可能重複的[Hadoop MapReduce:映射器的默認數量](http://stackoverflow.com/questions/10591278/hadoop-mapreduce-default-number-of-mappers) – harpun

+0

謝謝@irW的評論!我已經有類似的東西了,但是我想知道是否有像標準getter這樣的東西,而不是重新實現已經存在並且已經調用的方法。不過,如果沒有更好的解決方案,我會繼續使用這個解決方案。 – vefthym

回答

2

最後,看起來conf.get("mapred.map.tasks"))確實可行,當我生成一個可執行的jar文件並在集羣/本地運行我的程序時。現在「地圖任務」的輸出是正確的。

它只有在eclipse插件的hadoop本地運行我的mapreduce程序時才起作用。也許這是一個eclipse-plugin的問題。

我希望這會幫助其他人有同樣的問題。謝謝您的回答!

1

我不認爲有一個簡單的方法來做到這一點。我已經實現了自己的InputFormat類,如果你這樣做了,你可以實現一個方法來計算可以在啓動作業的過程中請求的InputSplits的數量。如果您在某些配置設置中輸入該號碼,則可以在映射程序中讀取該號碼。

btw輸入文件的數量並不總是映射器的數量,因爲可以拆分大文件。

+0

謝謝!看起來這是我唯一的選擇。我會試試這個,讓你知道它是否有效。我知道大文件可以被拆分,但它是在我找到永久解決方案之前運行我的代碼的最簡單方法。 – vefthym

相關問題