【问题标题】:same key coming in different reducers in hadoophadoop中不同reducer中的相同键
【发布时间】:2014-01-22 19:31:01
【问题描述】:

我正在经历一些非常奇怪的事情。我在不同的减速器中得到相同的密钥。我刚刚打印并收集了键和值。我的 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

key 1234529857009 重复两次,异常。任何想法为什么会发生这种情况。

谢谢

【问题讨论】:

  • 您能否检查一下这些值,让我们知道每个键提供了多少个值,其中有多少是不同的?
  • 谢谢。有 2 个不同的键,即 111-00-1234195967001 和 1234529857009。第一个产生 2 个值,第二个键提供 3 个值。但是这三个是拆分的,两个值在一个减速器中,第三个在不同的减速器中。现在正如 simplefish 所说,这是一种正常行为,这又是一个问题。我在对 simplefish 的评论中解释了它给我带来的问题。我正在使用单个节点。

标签: hadoop reducers


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。这对我来说是个问题。对于每个键,我都有一个日期值。所有相似的键/值都被收集在一个数组中,它们的日期/值被相互减去,差值被发送到 HDFS。现在,如果类似的键出现在不同的减速器中,那么数组是不完整的,输出不是我想要的。那么在这种情况下,替代方案是什么?
  • 只是为了让你知道不同reducer中的key也有不同的值。键有 3 个唯一值,其中 2 个来自一个减速器,第三个来自另一个减速器,这没有任何意义。在我看来,推测执行应该给出多余的值。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回复。我明白simplefish所说的和你所说的。我面临的问题很奇怪。使用相同的键有不同的归约组。请参阅上面的输出。它说我有 3 个不同的 reduce 组,而我说它应该是两个,因为有 2 个键。我还关闭了投机执行。输出还是一样的。
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
相关资源
最近更新 更多