4

每次运行 Hadoop 程序时,我都需要更改映射器和缩减器的数量。有没有办法从命令行(当我运行程序时)将映射器和减速器的数量传递给我的程序,然后用来args检索它?

4

2 回答 2

7

重要的是要了解您不能真正指定地图任务的数量。最终,映射任务的数量被定义为输入拆分的数量,这取决于您的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.tasksmapred.reduce.tasks,因此您可以使用这些参数运行您的作业:

-D mapred.map.tasks=42 -D mapred.reduce.tasks

它们将直接与您一起解析GenericOptionParser并自动填充您的Configuration对象。请注意,-D 和属性之间有一个空格,这很重要,否则这将被解释为 JVM 参数。

如果您想了解更多信息,这是一个很好的链接。

于 2013-05-28T02:01:44.120 回答
1

您可以使用参数指定映射器和缩减器的数量(实际上是您可以在配置中指定的任何参数)-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 的数量。

于 2013-05-27T23:59:30.880 回答