如何将参数传递给Hadoop中的主程序

时间:2013-05-27 23:37:10

标签: java hadoop mapreduce

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

2 个答案:

答案 0 :(得分:7)

重要的是要了解您无法真正指定地图任务的数量。最终地图任务的数量被定义为输入拆分的数量,这取决于您的InputFormat实施。假设您有1TB的输入数据,并且您的HDFS块大小为64MB,因此Hadoop将计算大约16k的地图任务,如果您指定的手动值小于16k,它将被忽略,但超过16k它将会使用。

要通过命令行传递,最简单的方法是使用内置类GenericOptionsParser(描述为here),它将直接解析常见的命令行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参数。

如果您想了解更多相关信息,请a good link

答案 1 :(得分:1)

您可以使用-D参数指定映射器和缩减器的数量(以及您可以在配置中指定的任何参数)。只要您extends Configured,这适用于所有默认的Hadoop jar和您自己的jar。

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");

或Reducers

job.getNumReduceTasks();

mapreduce.jobtracker.address is "local"时,使用配置值指定映射器将不起作用。请参阅Charles的回答,他解释了Hadoop通常如何根据数据大小确定Mappers的数量。