Hadoop 获取映射器的实际数量



在我的程序的映射阶段,我需要知道创建的映射器的总数。这将在映射的键创建过程中帮助我(我想为每个对象发出与映射器数量一样多的键值对(。

我知道设置映射器的数量只是一个提示,但是获取实际映射器数量的方法是什么。我在映射器的配置方法中尝试了以下内容:

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吗?

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

最后,当我生成一个可执行的 jar 文件并在集群/本地运行我的程序时,似乎conf.get("mapred.map.tasks"))确实有效。现在"映射任务"的输出是正确的。

它不仅在从 eclipse-plugin 的 hadoop 上本地运行我的 mapreduce 程序时才有效。也许这是一个日食插件的问题。

我希望这将帮助其他人遇到同样的问题。感谢您的回答!

我认为没有简单的方法可以做到这一点。我已经实现了我自己的 InputFormat 类,如果你这样做,你可以实现一个方法来计算你可以在启动作业的过程中请求的 InputSplit 的数量。如果将该数字放在某个配置设置中,则可以在映射器进程中读取它。

顺便说一句,输入文件的数量并不总是映射器的数量,因为可以拆分大文件。

相关内容

  • 没有找到相关文章

最新更新