2014-01-05 27 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