0

我正在经历一些非常奇怪的事情。我在不同的减速器中得到相同的密钥。我刚刚打印并收集了键和值。我的减速器代码如下所示。

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重复两次,异常。任何想法为什么会发生这种情况。

谢谢

4

2 回答 2

0

@shujaat - @simplefish 并不是说​​输出拆分是一种正常行为,而是多个 reducer 处理单个键是一种正常行为。来自下面关于推测执行的权威指南。

转到 JobTracker.jsp 页面并在作业下检查Reduce Input Records和部分Reduce Output Records中的值Map-Reduce Framework以查看它们是否相同。

重要的是要理解推测执行不能通过同时启动两个重复的任务来工作,这样它们就可以相互竞争。这会浪费集群资源。相反,推测性任务仅在作业的所有任务都已启动后才启动,然后仅针对已运行一段时间(至少一分钟)且平均而言未能取得同样多进展的任务,作为工作的其他任务。当任务成功完成时,任何正在运行的重复任务都将被终止,因为它们不再需要。因此,如果原始任务在推测任务之前完成,那么推测任务将被终止;另一方面,如果推测性任务首先完成,那么原来的任务就会被杀死。

于 2014-01-06T19:58:09.510 回答
0

由于 hadoop 的推测性执行,不能保证每个键在执行期间只进入 reducer 一次。您要注意的是完成的输出,而不是进程中的状态。因此,如果您将那个 reducer 替换为一个 identity reducer,并且您仍然在输出中看到重复的行,那么您需要担心一些事情。否则,它可能会按预期工作,因为 hadoop 可能会生成多个 reducer 作业,但只会保留其中一个的输出(通常是最先完成的那个)。

于 2014-01-05T18:51:26.143 回答