我在伪分布式模式下在ubuntu上设置了hadoop。我的理解是,我可以在伪模式下运行多个减速器。但即使将numReducetasks设置为2,我只得到一个输出文件作为partr0000。为什么会这样?
注意:我的输入文件只有12条记录。这是一种二级MR程序。
感谢您的帮助。
答案 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减少器,它只是框架的一个提示。我不保证你只得到指定的号码。减速器实际上取决于减号。在地图阶段之后获得的分区。而且基于没有。分区你会得到没有。减速器分区基于密钥发生,默认分区程序是散列分区程序。因此,密钥基于散列函数进行散列并分组成组。当您谈论如此小的数据时,所有密钥都会转到同一个分区,因为框架会尽力使处理尽可能高效,并为这么小的数据创建多个分区将是一个过度的问题。