2013-05-07 51 views

回答

0

其實沒有。 mappers主要由no。由您正在使用的InputFormat創建的InputSplits和No。的減少者的否。您在地圖階段後獲得的分區。話雖如此,你還應該記住插槽的數量,每個從機可用,以及可用內存。但作爲一個經驗法則,你可以使用這種方法:

以無。的虛擬CPU * .75,這是沒有。您可以配置的插槽。例如,如果您有12個物理核心(或24個虛擬核心),則您將擁有(24 * .75)= 18個插槽。現在,根據您的要求,您可以選擇要使用的映射器和縮減器的數量。有18個MR插槽,你可以有9個映射器和9個縮減器或12個映射器和9個縮減器,或者你認爲可以與你合作的任何東西。

HTH

2

你不能一概而論如何映射器的數量/減速將被設定。

映射器數量: 您不能將映射器數量明確設置爲某個數(有些參數可以設置它,但它不會生效)。這是由hadoop爲您給定的一組輸入創建的輸入拆分的數量決定的。您可以通過設置mapred.min.split.size參數來控制此設置。有關更多信息,請參閱InputSplit部分here。如果由於大量小文件而產生大量映射器,並且想要減少映射器的數量,那麼您將需要合併來自多個文件的數據。閱讀:How to combine input files to get to a single mapper and control number of mappers

從wiki頁面引用:

地圖的數量通常是由DFS塊的數量 輸入文件驅動。雖然這會導致人們調整DFS塊的大小 來調整地圖的數量。 地圖的平行度的正確水平似乎大約爲10-100地圖/節點,儘管我們已經將它用於非常cpu光地圖任務的 至300左右。任務設置需要一段時間,所以 最好是地圖至少需要一分鐘才能執行。

實際上控制地圖的數量是微妙的。 mapred.map.tasks參數僅僅是 地圖數量的InputFormat提示。默認的InputFormat行爲是將總數爲 的字節拆分爲正確數量的片段。但是,在 默認情況下,輸入文件的DFS塊大小將被視爲輸入拆分的上限 。分割大小的下限可以是 ,通過mapred.min.split.size設置。因此,如果您希望10TB的輸入數據爲 ,並且具有128MB的DFS塊,則最終將獲得82k個地圖,除非您的mapred.map.tasks更大。最終,InputFormat決定了 地圖的數量。

也可以使用JobConf的conf.setNumMapTasks(int num)手動增加地圖任務的數量。這可以用於增加地圖任務的數量,但不會將數字設置爲低於Hadoop通過分割輸入數據所確定的數量。

數減速器: 可以明確設置減速機的數量。只需設置參數mapred.reduce.tasks。有guidelines設置這個數字,但通常減少的默認數量應該足夠好。有時需要一個單一的報表文件,在這些情況下,您可能要減速的數量被設置爲1。

再從維基報價:

減少了正確的號碼似乎是0.95或1.75 *(節點* mapred.tasktracker.tasks.maximum)。在0.95處,所有的縮減可以立即啓動並開始傳輸地圖輸出,如地圖 完成。在1.75更快的節點將完成他們的第一輪 減少和發起第二輪減少做一個更好的工作 的負載平衡。

目前減少的數量由用於輸出文件的 緩衝器大小(io.buffer.size * 2 * numReduces < < HEAPSIZE)限定於大致1000。這將在某些時候被固定,但直到它 提供了一個非常堅定的上限。

減少的數量還控制着輸出目錄中的輸出文件的數量,但通常這並不重要,因爲下一步的 map/reduce步驟會將它們分割成更小的分割圖。

減少任務的數量也可以通過JobConf的conf.setNumReduceTasks(int num)以與地圖任務 相同的方式增加。