阅读 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
有谁知道这个值是如何计算的?我怎样才能在我的程序中获得这个值?
我搜索了 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类对象,您可以尝试在程序中手动计算所需的数字。
找到否决权主要是InputFormat
's 的职责。映射器,它是基于由InputFormat 类的InputSplits
内部方法编写的逻辑创建的。getSplits(JobContext context)
指定编号。通过 Job 或 config 文件或通过 shell 指定映射器只是对框架的提示,并不能保证您总是只得到指定的 no。映射器。
因此,这是根据您输入的大小默认设置的。 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? ,也有一些很好的答案