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