每次运行 Hadoop 程序时,我都需要更改映射器和缩减器的数量。有没有办法从命令行(当我运行程序时)将映射器和减速器的数量传递给我的程序,然后用来args
检索它?
2 回答
重要的是要了解您不能真正指定地图任务的数量。最终,映射任务的数量被定义为输入拆分的数量,这取决于您的InputFormat
实现。假设您有 1TB 的输入数据,并且您的 HDFS 块大小为 64MB,因此 Hadoop 将计算大约 16k 的映射任务,如果您指定的手动值小于 16k,它将被忽略,但超过 16k 的它将被忽略使用。
要通过命令行传递,最简单的方法是使用内置类GenericOptionsParser
(在此处描述),它将直接解析常见的命令行 Hadoop 相关参数,如您正在尝试执行的操作。好处是它允许您传递几乎任何您想要的 Hadoop 参数,而无需稍后编写额外的代码。你会做这样的事情:
public static void main(String[] args) {
Configuration conf = new Configuration();
String extraArgs[] = new GenericOptionsParser(conf, args).getRemainingArgs();
// do something with your non-Hadoop parameters if needed
}
现在您需要定义的属性来修改映射器和缩减器的数量分别是mapred.map.tasks
和mapred.reduce.tasks
,因此您可以使用这些参数运行您的作业:
-D mapred.map.tasks=42 -D mapred.reduce.tasks
它们将直接与您一起解析GenericOptionParser
并自动填充您的Configuration
对象。请注意,-D 和属性之间有一个空格,这很重要,否则这将被解释为 JVM 参数。
如果您想了解更多信息,这是一个很好的链接。
您可以使用参数指定映射器和缩减器的数量(实际上是您可以在配置中指定的任何参数)-D
。这适用于所有默认 Hadoop jar 和您自己的 jar,只要您 extends Configured
.
hadoop jar myJar.jar -Dmapreduce.job.maps=<Number of maps> -Dmapreduce.job.reduces=<Number of reducers>
从那里您可以使用检索值。
configuration.get("mapreduce.job.maps");
configuration.get("mapreduce.job.reduces");
或减速机
job.getNumReduceTasks();
当mapreduce.jobtracker.address is "local"
. 请参阅 Charles 的回答,其中他解释了 Hadoop 通常如何根据数据大小确定 Mapper 的数量。