【问题标题】:hadoop get actual number of mappershadoop 获取映射器的实际数量
【发布时间】:2013-10-18 10:04:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • wiki.apache.org/hadoop/HowManyMapsAndReduces 这取决于您的块大小和文件数。因此,如果您愿意,您实际上可以在 mapreduce 之外计算它,然后将此数字添加到作业的分布式缓存中。
  • 感谢@irW 的评论!我已经有类似的东西了,但我想知道是否有类似标准 getter 的东西,而不是重新实现已经存在并且已经被调用的方法。不过,如果没有更好的解决方案,我将继续使用此解决方案。

标签: hadoop mapreduce mappers


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!看来这是我唯一的选择。我会试试这个,让你知道它是否有效。我知道可以拆分大文件,但这是在找到永久解决方案之前让我的代码运行的最简单方法。
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2022-08-14
    • 2011-12-29
    相关资源
    最近更新 更多