2012-05-16 39 views
3

我正在使用Hadoop進行大學任務,並且我的代碼正在工作,但即時通訊遇到了一個小問題。Hadoop無法設置減少> 1

我想將reducer的數量設置爲19(這是文檔建議的0.95 *容量)。但是,當我在任務跟蹤器中查看我的工作時,它總共顯示1個縮減器。

System.err.println("here"); 
job.setNumReduceTasks(19); 
System.err.println(job.getNumReduceTasks()); 

產量預期:

here 
19 

但在最終輸出我得到:

12/05/16 11:10:54 INFO mapred.JobClient:  Data-local map tasks=111 
12/05/16 11:10:54 INFO mapred.JobClient:  Rack-local map tasks=58 
12/05/16 11:10:54 INFO mapred.JobClient:  Launched map tasks=169 
12/05/16 11:10:54 INFO mapred.JobClient:  Launched reduce tasks=1 

我已覆蓋的MapReduce的部分是:

  • 映射
  • 減速器
  • 分區器
  • 分組比較器。

我的第一個想法是分區器對每個鍵都返回相同的值。我檢查了這一點,情況並非如此。

我也檢查了石斑魚工作正常。

我不知道還有什麼可能導致這種情況。如果有人可以幫助它,將不勝感激。

我非常反對Java的人,所以請嘗試使用非常明確的例子,如果你可以。 PS:我沒有設置這個簇,它是由大學設置的,所以我不確定任何配置變量。 PS:有太多的代碼要發佈,所以請讓我知道任何代碼,特別是你想看到的。

編輯:我被TejasP提出以下問題:

你真的運行在本地模式在Hadoop的代碼或它的? (如果您的工作在jobtracker和tasktracker上看到,請參閱 )。

是的我是,它可以在jobtracker UI中查看。這也報告1減速機。以及具有 注意:在settings.xml中將reducer列爲1

您是否在環境中導出了HADOOP變量?

是,他們是在ENV可見的代碼無法編譯,直到我已經設置。

env | grep HADOOP 
HADOOP_HOME=/mnt/biginsights/opt/ibm/biginsights/IHC 
HADOOP_CONF_DIR=/mnt/biginsights/opt/ibm/biginsights/hadoop-conf 

是羣集單個節點或多個節點? 並且即使該羣集是多個節點,是否所有節點都健康?其他節點有問題嗎?

是有多個節點(10)作業服務器報告:

Nodes: 10 
Map Task Capacity: 20 
Reduce Task Capacity: 20 
Blacklisted Nodes: 0 

您是否正確使用setNumReduceTasks? 如上所述,我已經調用了set,​​然後獲取並獲得它需要的值(19),但最終的代碼仍然只使用了1.

您可以將代碼縮減爲小型map-reduce代碼通過刪除細節(這只是爲了調試)。運行。走着瞧吧。面對同樣的問題,在原始問題中提供簡化的代碼。

我會嘗試的結果

+0

你能看到什麼是在XML配置在你的工作中。 (在web前端的作業視圖中,靠近「作業文件」的藍色鏈接)。爲「mapred.reduce.tasks」關鍵字映射了什麼值? –

+0

值爲,mapred.reduce.tasks:1 什麼是設置這個數字? – Nick

+0

我相信這是一個錯誤。你可以直接通過你的配置來設置值,我想這是job.set(「mapred.reduce.tasks」,「19」);.其實這個方法應該正確地做到這一點。 –

回答

1

,你需要考慮幾點再次編輯:

  1. 你真的運行在Hadoop或者其在本地模式下的代碼? (看你的工作是否在jobtracker和tasktracker上看到)
  2. 你是否已經在環境中導出HADOOP變量?
  3. 是集羣單節點還是多節點?
  4. 即使該羣集是多個節點,是否所有節點都健康?其他節點有問題嗎?
  5. 您是否正確使用setNumReduceTasks?您可以通過刪除細節將代碼縮減爲小型映射 - 減少代碼(這僅用於調試)。運行。走着瞧吧。面對同樣的問題,在原始問題中提供簡化的代碼。
+0

謝謝我編輯了我的原始問題,以包括這些問題的答案(除了正在進行縮減的代碼) – Nick

2

它看起來像你在LocalJobRunner模式下運行它(很可能來自eclipse)。在這種模式下,如果減少任務的數量> 1,它重置爲1的數量看看下面的幾行LocalJobRunner.java

int numReduceTasks = job.getNumReduceTasks(); 
if (numReduceTasks > 1 || numReduceTasks < 0) { 
     // we only allow 0 or 1 reducer in local mode 
     numReduceTasks = 1; 
     job.setNumReduceTasks(1); 
} 
+0

謝謝您的回答。我希望這對其他人有幫助,但是我的問題是因爲我被推遲而引起的......請參閱我對OP的評論。 – Nick