在我的程序的map阶段,我需要知道创建的映射器总数。这将有助于我在地图的密钥创建过程中(我希望为每个对象发出与映射器数量一样多的键值对)。
我知道设置映射器的数量只是一个提示,但是获取实际的映射器数量的方法是什么。 我在Mapper的configure方法中尝试了以下内容:
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任务,而不仅仅是一个,因为我有两个小的输入文件,这很自然。地图任务后的数字不应该是2?
现在,我只计算输入文件夹中的文件数,但这不是一个好的解决方案,因为文件可能大于块大小并导致多个输入拆分,因此也就是映射器。有什么建议吗?
答案 0 :(得分:2)
最后,当我生成一个可执行的jar文件并在集群/本地运行我的程序时,conf.get("mapred.map.tasks"))
似乎完全可以工作。现在“地图任务”的输出是正确的。
只有在eclipse-plugin的hadoop本地运行我的mapreduce程序时才能正常工作。也许这是一个eclipse-plugin的问题。
我希望这会帮助其他人遇到同样的问题。谢谢你的回答!
答案 1 :(得分:1)
我认为没有一种简单的方法可以做到这一点。我已经实现了自己的InputFormat类,如果你这样做,你可以实现一个方法来计算你可以在启动作业的过程中请求的InputSplits的数量。如果您将该数字放在某个配置设置中,则可以在映射器进程中读取它。
btw输入文件的数量并不总是映射器的数量,因为可以拆分大文件。