我正在经历一些非常奇怪的事情。我在不同的减速器中得到相同的钥匙。我只是打印并收集了关键和值。我的reducer代码看起来像这样。
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 :(得分:0)
由于hadoop的speculative execution,不能保证每个键在执行期间只进行一次减速器。您需要注意的是已完成的输出,而不是进行中的状态。因此,如果使用标识缩减器替换该缩减器,并且仍然在输出中看到重复的行,那么您需要担心一些事情。否则,它可能按预期工作,因为hadoop可能会生成多个reducer作业,但只会保留其中一个的输出(通常是先完成的那个)。
答案 1 :(得分:0)
@shujaat - @simplefish并不是说输出分裂是一种正常行为,而是处理单个密钥的多个reducer是正常行为。来自下面关于投机执行的权威指南。
转到JobTracker.jsp页面并在作业下检查Reduce Input Records
部分中Reduce Output Records
和Map-Reduce Framework
的值,看看它们是否相同。
重要的是要理解投机执行不能通过几乎同时启动两个重复任务来工作,这样他们就可以相互竞争。这将浪费集群资源。相反,只有在已启动作业的所有任务之后才启动推测任务,然后仅针对已运行一段时间(至少一分钟)的任务启动,并且平均未能取得同样多的进度 作为工作中的其他任务。任务成功完成后,任何正在运行的重复任务都将被终止,因为不再需要它们。因此,如果原始任务在推测任务之前完成,则推测任务被终止;另一方面,如果推测任务首先完成,则原始文件被杀死。