2011-08-31 60 views
0

我在Hadoop平臺(cloudera發佈)中編寫了一個相對簡單的map-reduce程序。每個地圖&除了常規地圖縮小任務之外,還可以將一些診斷信息寫入標準輸出。爲什麼所有的reduce任務都在一臺機器中結束?

但是,當我在查看這些日誌文件時,我發現Map任務在節點間(我有8個節點)相對均勻分佈。但是減少任務標準輸出日誌只能在一臺機器上找到。

我想,這意味着所有的reduce任務最終在一臺機器上執行,這是有問題的和令人困惑的。

有沒有人知道這裏發生了什麼?它是配置問題嗎? 我怎樣才能使減少工作也均勻分配?

+0

是映射器產生多個密鑰在KV對?如果碰巧是一個單一的鍵,那麼將只有一個減速器。如果不是這種情況,那麼可能是一個配置問題。 –

回答

6

如果映射器的輸出全部具有相同的密鑰,則它們將被放入一個簡化器中。

如果你的工作有多個reducer,但他們都在一臺機器上排隊,那麼你有一個配置問題。

使用Web界面(http://MACHINE_NAME:50030)來監控作業,並查看它的縮減器以及運行它的機器。還有其他可以深入研究的信息將提供有助於解決問題的信息。

有關配置的夫婦的問題:

  • 多少減速正在運行的工作嗎?
  • 每個節點上有多少個reducer?
  • 運行減速機的節點是否比其他節點更好地運行硬件 ?
+0

1)7減速機運轉良好。 2)如何檢查這一個? 3)所有減速器具有完全相同的硬件和軟件配置。 – ablimit

+0

我從Web界面查看執行日誌。它有多個減少任務,但是所有減少任務以某種方式在一臺機器上運行。 – ablimit

+1

我想我發現了這個問題。每個節點有8個核心。所以hadoop會在這臺機器上填滿8個任務並轉移到下一個。如果我將reducer數設置爲更高的數字(例如32),那麼它會將作業分配給多個節點。 – ablimit

2

Hadoop的決定哪些減速將處理其輸出密鑰通過使用Partitioner 的。如果你只輸出幾個鍵,並想跨減速均勻分佈,你可能會更好實現自定義分區程序你輸出數據。例如

public class MyCustomPartitioner extends Partitioner<KEY, VALUE> 
{ 
    public int getPartition(KEY key, VALUE value, int numPartitions) { 
      // do something based on the key or value to determine which 
      // partition we want it to go to. 
    } 
} 

然後,您可以設置在任務配置這個自定義分區與

Job job = new Job(conf, "My Job Name"); 
job.setPartitionerClass(MyCustomPartitioner.class); 

您也可以實現您的自定義分區程序的配置界面,如果你想根據崗位設置做任何進一步的配置。 另外,檢查你有沒有設定減少配置的任何地方任務爲1(尋找「mapred.reduce.tasks」),或在代碼的數量,例如

job.setNumReduceTasks(1); 
相關問題