2013-10-10 31 views
3

在我的程序的地图阶段,我需要知道创建的mappers的总数。这将帮助我在地图的关键创建过程中(我想为每个对象发出与mappers数一样多的关键值对)。hadoop得到实际的mappers人数

我知道设置mappers的数量只是一个提示,但获得的实际数量是多少。 我想在我的映射器的配置方法如下:

public void configure(JobConf conf) { 
    System.out.println("map tasks: "+conf.get("mapred.map.tasks")); 
    System.out.println("tipid: "+conf.get("mapred.tip.id")); 
    System.out.println("taskpartition: "+conf.get("mapred.task.partition")); 
} 

但我得到的结果:(?)

map tasks: 1 
tipid: task_local1204340194_0001_m_000000 
taskpartition: 0 
map tasks: 1 
tipid: task_local1204340194_0001_m_000001 
taskpartition: 1 

,这意味着有两个地图的任务,不只是一个,打印出来(这很自然,因为我有两个小输入文件)。地图任务后的数字不应该是2吗?

现在,我只是计算输入文件夹中的文件数量,但这不是一个好的解决方案,因为文件可能大于块大小,并导致多个输入拆分并因此导致映射器。有什么建议么?

+1

http://wiki.apache.org/hadoop/HowManyMapsAndReduces 这取决于你的块大小和你的文件数量。因此,如果您想要,然后将此编号添加到您的作业的distributedCache,您实际上可以在mapreduce之外进行计算。 – DDW

+0

可能重复的[Hadoop MapReduce:映射器的默认数量](http://stackoverflow.com/questions/10591278/hadoop-mapreduce-default-number-of-mappers) – harpun

+0

谢谢@irW的评论!我已经有类似的东西了,但是我想知道是否有像标准getter这样的东西,而不是重新实现已经存在并且已经调用的方法。不过,如果没有更好的解决方案,我会继续使用这个解决方案。 – vefthym

回答

2

最后,看起来conf.get("mapred.map.tasks"))确实可行,当我生成一个可执行的jar文件并在集群/本地运行我的程序时。现在“地图任务”的输出是正确的。

它只有在eclipse插件的hadoop本地运行我的mapreduce程序时才起作用。也许这是一个eclipse-plugin的问题。

我希望这会帮助其他人有同样的问题。谢谢您的回答!

1

我不认为有一个简单的方法来做到这一点。我已经实现了自己的InputFormat类,如果你这样做了,你可以实现一个方法来计算可以在启动作业的过程中请求的InputSplits的数量。如果您在某些配置设置中输入该号码,则可以在映射程序中读取该号码。

btw输入文件的数量并不总是映射器的数量,因为可以拆分大文件。

+0

谢谢!看起来这是我唯一的选择。我会试试这个,让你知道它是否有效。我知道大文件可以被拆分,但它是在我找到永久解决方案之前运行我的代码的最简单方法。 – vefthym

相关问题