我在 ubuntu 上以伪分布式模式设置了 hadoop。我的理解是我可以在伪模式下使用多个 reducer 运行一项工作。但即使将 numReducetasks 设置为 2,我也只得到一个输出文件 partr0000。这是为什么?
注意:我的输入文件只有 12 条记录。这是一个二级排序的 MR 程序。
感谢您的帮助。
最佳答案
如果您看到默认分区程序 HashPartitioner
的 getPartition()
,它看起来如下所示:
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
我认为所有记录都属于同一个分区只是偶然发生的。只需运行一个测试,看看您使用 12 条记录为上述函数获得了哪些值。
reducer 的数量和输出文件的数量不必总是相同,因为某些 reducer 可能没有输出记录(即使它收到了一些输入)。
运行此作业时,还要从浏览器中检查 hadoop UI,您应该会看到 reducer 的总数与您设置的数量一致。
检查您的 conf/mapred-site.xml
,您可以找到要查看 Hadoop UI 的 URL:
<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
,您应该会看到正在运行的作业列表。
关于即使我将 numReducetasks 设置为 2,Hadoop 也只会生成一个输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17162637/