2014-01-05 28 views
0

我遇到一些非常奇怪的事情。我在不同的減速器中獲得相同的鑰匙。我只是打印並收集了關鍵和值。我的reducer代碼如下所示。同樣的鑰匙在不同的減速器進來hadoop

public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { 

System.out.println("The key is "+ key.toString()); 

while(values.hasNext()){ 


     Text value=values.next(); 

     key.set(""); 
     output.collect(key, value); 

    } 
} 

在控制檯上的輸出是

The key is 111-00-1234195967001 
The key is 1234529857009 
The key is 1234529857009 
14/01/06 20:11:16 INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting 
14/01/06 20:11:16 INFO mapred.LocalJobRunner: 
14/01/06 20:11:16 INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now 
14/01/06 20:11:16 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://localhost:54310/user/hduser/joboutput11 
14/01/06 20:11:18 INFO mapred.LocalJobRunner: reduce > reduce 
14/01/06 20:11:18 INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done. 
14/01/06 20:11:19 INFO mapred.JobClient: map 100% reduce 100% 
14/01/06 20:11:19 INFO mapred.JobClient: Job complete: job_local_0001 
14/01/06 20:11:19 INFO mapred.JobClient: Counters: 23 
14/01/06 20:11:19 INFO mapred.JobClient: File Input Format Counters 
14/01/06 20:11:19 INFO mapred.JobClient:  Bytes Read=289074 
14/01/06 20:11:19 INFO mapred.JobClient: File Output Format Counters 
14/01/06 20:11:19 INFO mapred.JobClient:  Bytes Written=5707 
14/01/06 20:11:19 INFO mapred.JobClient: FileSystemCounters 
14/01/06 20:11:19 INFO mapred.JobClient:  FILE_BYTES_READ=19185 
14/01/06 20:11:19 INFO mapred.JobClient:  HDFS_BYTES_READ=1254215 
14/01/06 20:11:19 INFO mapred.JobClient:  FILE_BYTES_WRITTEN=270933 
14/01/06 20:11:19 INFO mapred.JobClient:  HDFS_BYTES_WRITTEN=5707 
14/01/06 20:11:19 INFO mapred.JobClient: Map-Reduce Framework 
14/01/06 20:11:19 INFO mapred.JobClient:  Map output materialized bytes=5633 
14/01/06 20:11:19 INFO mapred.JobClient:  Map input records=5 
14/01/06 20:11:19 INFO mapred.JobClient:  Reduce shuffle bytes=0 
14/01/06 20:11:19 INFO mapred.JobClient:  Spilled Records=10 
14/01/06 20:11:19 INFO mapred.JobClient:  Map output bytes=5583 
14/01/06 20:11:19 INFO mapred.JobClient:  Total committed heap usage (bytes)=991539200 
14/01/06 20:11:19 INFO mapred.JobClient:  CPU time spent (ms)=0 
14/01/06 20:11:19 INFO mapred.JobClient:  Map input bytes=289074 
14/01/06 20:11:19 INFO mapred.JobClient:  SPLIT_RAW_BYTES=627 
14/01/06 20:11:19 INFO mapred.JobClient:  Combine input records=0 
14/01/06 20:11:19 INFO mapred.JobClient:  Reduce input records=5 
14/01/06 20:11:19 INFO mapred.JobClient:  Reduce input groups=3 
14/01/06 20:11:19 INFO mapred.JobClient:  Combine output records=0 
14/01/06 20:11:19 INFO mapred.JobClient:  Physical memory (bytes) snapshot=0 
14/01/06 20:11:19 INFO mapred.JobClient:  Reduce output records=7 
14/01/06 20:11:19 INFO mapred.JobClient:  Virtual memory (bytes) snapshot=0 
14/01/06 20:11:19 INFO mapred.JobClient:  Map output records=5 

關鍵1234529857009重複兩次這是不正常的。任何想法爲什麼發生這種情況。

感謝

+0

您可以檢查值並告訴我們每個鍵提供了多少個值以及它們有多少個不同? – Mehraban

+0

謝謝。有兩個不同的密鑰,即111-00-1234195967001和1234529857009.第一個產生2個值,第二個密鑰提供3個值。但是,這三者是分開的,兩個值分別來自一個還原器和第三個還原器。現在simplefish說這是一個正常的行爲,這又是一個問題。我在simplefish回覆評論中解釋了它爲我創造的問題。我正在使用單個節點。 – shujaat

回答

0

由於Hadoop的speculative execution它不能保證在執行過程中,每個鍵只需進入減速一次。你要注意的是完成的輸出,而不是進程中的狀態。因此,如果您使用身份縮減器來替換該縮減器,並且您仍然在輸出中看到重複的行,那麼您就有些擔心。否則,它可能會按預期工作,因爲hadoop可能會生成多個reducer作業,但只保留其中一個的輸出(通常是第一個完成的作業)。

+0

感謝您的回覆。這對我造成了一個問題。每一個關鍵我都有一個價值,那就是約會。所有類似的鍵/值都被收集在一個數組中,並且它們的日期/值被相互減去,差值被髮送到HDFS。現在,如果類似的鍵在不同的減速器中出現,那麼陣列不完整,輸出不是我想要的。那麼這種情況下的替代方案是什麼? – shujaat

+0

只是爲了讓你知道,即將到來的不同減速器的關鍵也有不同的價值。鑰匙有三個獨特的值,其中兩個是在一個減速器中進入,第三個是不同的減速器,這是沒有意義的。在我看來,投機執行應該給予多餘的價值。 – shujaat

0

@shujaat - @simplefish並不是說輸出獲取分裂是一種正常行爲,而是多個處理單個鍵的多個reducer是一種正常行爲。從下面的「投機執行權威指南」中。

進入JobTracker.jsp頁面,在作業下,檢查Reduce Input RecordsReduce Output Records的值,在Map-Reduce Framework部分查看它們是否相同。

重要的是要明白,推測執行不起作用,通過大約在同一時間啓動兩個重複的任務,因此他們可以競爭彼此。這會浪費集羣資源。相反,推測性任務只有在所有任務已經啓動後纔會啓動,然後僅適用於已運行一段時間(至少一分鐘)的任務,並且平均而言未取得如此大的進展, 作爲工作中的其他任務。當任務成功完成時,任何正在運行的重複任務都將被終止,因爲不再需要它們。因此,如果原始任務在投機任務之前完成,那麼投機任務將被終止;另一方面,如果推測性任務先完成,則原始人被殺害。

+0

感謝您的回覆。我明白simplefish說什麼和你說什麼。我面臨的問題很奇怪。相同的密鑰有不同的縮小組。看到上面的輸出。它說我有3個不同的減少組,而我說它應該是兩個,因爲有2個鍵。我也推翻了投機性的執行。輸出仍然是一樣的。 – shujaat