1

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

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

谢谢你的帮助。

4

3 回答 3

3

如果您看到getPartition()默认分区器的HashPartitioner,它看起来如下所示:

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

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

并且reducer 的数量和输出文件的数量不必总是相同的,因为某些reducer 可能没有输出记录(即使它收到了一些输入)。

运行此作业时,还要从浏览器中检查 hadoop UI,您应该会看到减速器的总数为您设置的数量。检查您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,您应该会看到正在运行的作业列表。

于 2013-06-18T19:11:28.553 回答
1

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

于 2013-06-18T07:21:12.607 回答
0

当你设置没有。通过 numReducetasks 的 reducer,这只是对框架的一个提示。我不保证你只会得到指定的号码。减速器,因为它实际上取决于否。在映射阶段之后获得的分区数。并基于没有。分区,你会得到没有。的减速器。分区基于键发生,默认分区器是哈希分区器。因此,密钥基于散列函数进行散列并分组。当您谈论如此小的数据时,所有键都进入同一个分区,因为该框架会尽最大努力使处理尽可能高效,而为如此小的数据创建多个分区将是多余的。

于 2013-06-18T08:22:19.367 回答