2013-10-04 53 views
0

我有問題。 我想增加我的地圖並減少我的輸入數據的數量。當我執行System.out.println(conf.getNumReduceTasks())System.out.println(conf.getNumMapTasks())它讓我看到:增加地圖數量並減少功能

1 1 

,當我執行conf.setNumReduceTasks(1000000)conf.setNumMapTasks(1000000),並再次執行println方法它顯示我:

1000000 1000000 

,但我認爲沒有什麼改變我mapreduce程序執行時間。我的輸入是來自cassandra,實際上它是cassandra列家族行約362000行。 我想設置我的地圖的數量和減少功能的輸入行數。

我該怎麼辦?

回答

1

爲map/reduce作業設置map/reduce任務的數量確定了將使用多少個map/reduce進程來處理作業。考慮一下,如果你真的需要這麼多的java進程。

也就是說,地圖任務的數量大多是自動確定的;設置地圖任務的數量只是一個提示,可以增加由Hadoop確定的地圖數量。

對於減少任務,默認值爲1,實際限制約爲1,000。

請參見:http://wiki.apache.org/hadoop/HowManyMapsAndReduces

同樣重要的是要明白,你的集羣中的每個節點也有地圖的最大數量/減少可以同時執行任務。這是通過以下配置設置設置:

mapred.tasktracker.map.tasks.maximum 和 mapred.tasktracker.reduce.tasks.maximum

對於這兩個默認值爲2

因此,增加map/reduce任務的數量將被限制爲每個節點可以同時運行的任務數。這可能是您沒有看到工作執行時間發生變化的原因之一。

參見:http://hadoop.apache.org/docs/stable/mapred-default.html

的總結是: 讓Hadoop的決定地圖的數量,除非你想要更多的地圖任務。

使用mapred.tasktracker..tasks.maximum設置來控制一次可以運行多少個任務。

用於減少任務應該是介於1或2 *(mapred.tasktracker.reduce.tasks.maximum * #nodes)的數目的最大值。您還必須考慮您希望一次運行多少個map/reduce作業,以便單個作業不會佔用所有可用的縮減插槽。

對於任一設置,值爲1,000,000幾乎肯定是太高;運行這麼多java進程是不現實的。我預計這樣高的價值會被忽略。

設置了mapred.tasktracker..tasks之後。最大限度地增加您的節點能夠同時運行的任務數量,然後嘗試增加您的作業的地圖/減少任務。

您可以在job.xml文件中看到作業使用的實際任務數,以驗證您的設置。

+0

非常感謝您的幫助.. –