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

HHH*_*HHH 4 java hadoop mapreduce

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

Cha*_*guy 7

重要的是要了解您无法真正指定地图任务的数量.最终,map任务的数量被定义为输入拆分的数量,这取决于您的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
}
Run Code Online (Sandbox Code Playgroud)

现在你需要的属性来定义修改映射器的数量和减速器分别mapred.map.tasksmapred.reduce.tasks,这样你就可以运行这些参数你的工作:

-D mapred.map.tasks=42 -D mapred.reduce.tasks
Run Code Online (Sandbox Code Playgroud)

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

如果您想了解更多相关信息,这里有一个很好的链接.