即使我将numReducetasks设置为2,Hadoop也只生成一个输出文件

时间:2013-06-18 07:10:01

标签: hadoop mapreduce

我在伪分布式模式下在ubuntu上设置了hadoop。我的理解是,我可以在伪模式下运行多个减速器。但即使将numReducetasks设置为2,我只得到一个输出文件作为partr0000。为什么会这样?

注意:我的输入文件只有12条记录。这是一种二级MR程序。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

如果您看到默认partiotioner的getPartition()HashPartitioner,它看起来就像以下一样:

public int getPartition(K key, V value, int numReduceTasks) { 
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
}

我认为这里发生的只是偶然所有记录都属于同一个分区。只需运行一个测试,看看您使用12条记录获得上述函数的值。

减少器的数量和输出文件的数量不必总是相同,因为某些减速器可能没有输出记录(即使它接收到一些输入)。

在运行此作业时,还要从浏览器中检出hadoop UI,您应该看到减少器的总数与您设置的数量。 检查您的conf/mapred-site.xml,他们可以找到要查看Hadoop UI的网址:

<property>
  <name>mapred.job.tracker</name>
  <value>localhost:54311</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>            

因此,如果您点击localhost:54311,您应该会看到正在运行的作业列表。

答案 1 :(得分:1)

我认为这是因为记录数量。默认情况下,Hadoop为每个群集占用64 MB数据,因为您的数据少于1个块,因此不会分成多个块。

答案 2 :(得分:0)

当你设置不。通过numReducetasks减少器,它只是框架的一个提示。我不保证你只得到指定的号码。减速器实际上取决于减号。在地图阶段之后获得的分区。而且基于没有。分区你会得到没有。减速器分区基于密钥发生,默认分区程序是散列分区程序。因此,密钥基于散列函数进行散列并分组成组。当您谈论如此小的数据时,所有密钥都会转到同一个分区,因为框架会尽力使处理尽可能高效,并为这么小的数据创建多个分区将是一个过度的问题。