在程序的Map阶段,我需要知道创建的Map器的总数。这将在Map的键创建过程中帮助我(我希望为每个对象发出与Map器数量一样多的键值对)。
我知道设置Map者的数量只是一个提示,但是怎样才能得到Map者的实际数量呢。我在Map器的配置方法中尝试了以下操作:
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
这意味着(?)有两个Map任务,而不仅仅是一个,打印出来的(这是很自然的,因为我有两个小的输入文件)。Map任务后的数字不应该是2吗?
目前,我只计算输入文件夹中的文件数,但这不是一个好的解决方案,因为一个文件可能大于块大小,并导致多个输入拆分和Map器。有什么建议吗?
2条答案
按热度按时间tkqqtvp11#
我不认为有一个简单的方法可以做到这一点。我已经实现了我自己的inputformat类,如果您这样做了,您可以实现一个方法来计算在启动作业的进程中可以请求的inputspilt的数量。如果将该数字放入某些配置设置中,则可以在Map程序进程中读取它。
顺便说一句,输入文件的数量并不总是Map器的数量,因为大文件可以分割。
93ze6v8z2#
最后,似乎
conf.get("mapred.map.tasks"))
毕竟,当我生成一个可执行的jar文件并在集群/本地运行我的程序时,它是有效的。现在“map tasks”的输出是正确的。它不仅在本地从eclipse插件在hadoop上运行mapreduce程序时起作用。可能是eclipse插件的问题。
我希望这能帮助其他有同样问题的人。谢谢你的回答!