将参数传递给Hadoop中的map函数

时间:2011-12-10 14:29:56

标签: java hadoop mapreduce parameter-passing

我是Hadoop的新手。我想从mapper类的map函数中的main函数(Java程序)访问命令行参数。请建议如何做到这一点。

3 个答案:

答案 0 :(得分:19)

Hadoop 0.20,引入了新的MR API,新的(oahmapreduce包)和旧的MR API(oahmapred)之间没有太大的功能差异,除了数据可以在映射器和reducers中使用新的API。提到Arnon的是旧API。

检查此article是否使用新旧API传递参数。

答案 1 :(得分:14)

您可以通过在参数

上挂起参数来传递参数
 JobConf job = new JobConf(new Configuration(), TheJob.class);
 job.setLong("Param Name",longValue)

Configuration类有很少的设置方法(Long,Int,Strings等),因此您可以传递多种类型的参数。在map作业中,您可以从Context(getConfiguration)

获取配置

答案 2 :(得分:4)

在最近的Hadoop中(例如> = 0.2到2.4+),您可以在作业配置期间设置此类选项:

conf = new JobConf(MyJarClass);
conf.set("myStringOption", "myStringValue");
conf.set("myIntOption", 42);

并在mapper / reducer类的configure()方法中检索这些选项:

public static class MyMapper extends MapReduceBase implements Mapper<...> {

    Integer myIntegerOption;
    String myStringOption;

    @Override
    public void configure(JobConf job) {
        super.configure(job);
        myIntegerOption = job.getInt("myIntOption", -1); 
        // nb: last arg is the default value if option is not set
        myStringOption = job.get("myStringOption", "notSet");
    }

    @Override
    public void map(... key, ... value, 
                    OutputCollector<..> output, Reporter reporter) throws IOException {
        // here you can use the options in your processing
        processRecord(key, value, myIntOption, myStringOption);
    }

}

请注意,configure()将在任何记录传递到地图或减少之前调用一次。