读取Hadoop生成的syslog,我可以看到与此类似的行..
2013-05-06 16:32:45,118 INFO org.apache.hadoop.mapred.JobClient (main): Setting default number of map tasks based on cluster size to : 84
有谁知道这个值是如何计算的? 我怎样才能在我的程序中获得这个值?
答案 0 :(得分:3)
我抓了Hadoop的源代码并且根本找不到字符串Setting default number of map tasks based on cluster size to
(而我找到其他字符串,在运行MR作业时正在打印)。此外,此字符串不会在本地安装中的任何位置打印。谷歌搜索它在AWS上列出了EMR问题。
如您所知,您实际上正在使用Amazon Elastic MapReduce。我相信EMR对Hadoop的JobClient类有一些修改,它会输出这一特定的行。
就计算此数字而言,我怀疑它是基于total number of (active) nodes in cluster (N)
和number of map slots per node (M)
等特征计算的,即N*M
。但是,也可以考虑其他特定于AWS的资源(内存)约束。您必须在EMR相关论坛中询问确切的公式。
另外,JobClient
公开了一组有关集群的信息。使用方法JobClient#getClusterStatus(),您可以访问以下信息:
通过ClusterStatus类对象,这样您就可以尝试手动计算程序中所需的数字。
答案 1 :(得分:0)
因此,默认情况下会根据输入的大小设置此值。 http://wiki.apache.org/hadoop/HowManyMapsAndReduces。您可以指定更多映射器,但不能少于hadoop定义的数量。
您应该可以通过获取配置选项“mapred.map.tasks”来访问此号码。如果您使用旧的api,也可以从此函数中获取它。
conf.getNumMapTasks();
上一个问题How to set the number of map tasks in hadoop 0.20?也有一些好的答案
答案 2 :(得分:0)
主要是InputFormat
找到号码的义务。映射器,它是基于由InputFormat类的InputSplits
方法内部编写的逻辑创建的getSplits(JobContext context)
完成的。指定号码。 mappers通过Job或配置文件或通过shell指定它只是对框架的提示,并不保证你总是只得到指定的no。地图集。