每次运行我的Hadoop程序时,我都需要更改映射器和缩减器的数量。有没有办法从命令行(当我运行程序时)将映射器和缩减器的数量传递给我的程序,然后使用args
来检索它?
答案 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.tasks
和mapred.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的数量。