Hadoop Mapreduce传递命令行参数

Hadoop Mapreduce传递命令行参数,hadoop,mapreduce,hadoop2,Hadoop,Mapreduce,Hadoop2,我正在尝试使用MapReduce的新API,并将一个常规的Expression作为a-D命令行参数传递进来,但没有被接受。结果是Pattern.compile(Pattern)得到一个NullPointerException 我的映射程序代码是 public class MdacMapper extends Mapper<Text, Text, Text, Text> { private Pattern compiledPattern; public void s

我正在尝试使用MapReduce的新API,并将一个常规的Expression作为a-D命令行参数传递进来,但没有被接受。结果是Pattern.compile(Pattern)得到一个
NullPointerException

我的映射程序代码是

public class MdacMapper extends Mapper<Text, Text, Text, Text> {

    private Pattern compiledPattern;

    public void setup(Context context) {
        Configuration config = context.getConfiguration();
        String pattern = config.get("mapper.pattern");
        compiledPattern = Pattern.compile(pattern);
    }

    // mapper
}
public class JobController {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();

       Job job = new Job(conf);
       job.setJarByClass(JobController.class);
       job.setInputFormatClass(TextInputFormat.class);
       job.setOutputFormatClass(TextOutputFormat.class);

       FileInputFormat.setInputPaths(job, new Path(args[0]));
       FileOutputFormat.setOutputPath(job, new Path(args[1]));

       job.setMapperClass(MdacMapper.class);
       job.setReducerClass(MdacReducer.class);
       job.setMapOutputKeyClass(Text.class);
       job.setMapOutputValueClass(Text.class);
       job.setOutputKeyClass(Text.class);
       job.setOutputValueClass(Text.class);

       job.waitForCompletion(true);
       job.submit();
    }
}

最后,我正在进行的命令行调用是

 hadoop jar mapreducer.jar /input/aclogdrop /output/acjava \ 
 -Dmapper.pattern=".*\|(\d{8}):\d*\.\d*\|(\d+)\|AC_ADO_QRY\(\d*?\)\|\d?\s?\[\s?(.*?)\]"

有什么建议可以解释为什么我不能选择配置参数mapper.pattern吗?

也许你应该使用
GenericOptions Parser

下面是您要使用的API,例如:

公共类WordCount扩展配置的实现工具{
公共静态类映射
扩展映射器{
私有最终静态IntWritable one=新的IntWritable(1);
私有最终静态文本字=新文本();
公共无效设置(上下文){
Configuration config=context.getConfiguration();
String-wordstring=config.get(“mapper.word”);
set(wordstring);
}
/*字数映射器*/
}
公共静态void main(字符串[]args)引发异常{
int res=ToolRunner.run(新配置(),新字数(),args);
系统退出(res);
}
公共int运行(字符串[]args)引发异常{
如果(参数长度!=2){
System.err.println(“用法:wordcount”);
系统出口(2);
}
Configuration=this.getConf();
Job Job=新作业(conf,“WordCount”);
job.setJarByClass(WordCount.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
setInputPaths(作业,新路径(args[0]);
setOutputPath(作业,新路径(args[1]);
返回作业。waitForCompletion(true)?0:1;
}
}

此外,使用工具界面时,必须首先在命令中指定通用选项(例如,-D property=value),然后指定应用程序参数

正确的命令如下所示:

hadoop jar mapreducer.jar -D mapper.pattern=".*\|(\d{8}):\d*\.\d*\|(\d+)\|AC_ADO_QRY\(\d*?\)\|\d?\s?\[\s?(.*?)\]" /input/aclogdrop /output/acjava

谢谢你的帖子。使用这个.getConf()解决了我的问题。在此之前,我使用new Configuration()获取配置,它没有反映我使用-D选项传递的值。
hadoop jar mapreducer.jar -D mapper.pattern=".*\|(\d{8}):\d*\.\d*\|(\d+)\|AC_ADO_QRY\(\d*?\)\|\d?\s?\[\s?(.*?)\]" /input/aclogdrop /output/acjava