请注意,这个问题在经过仔细审查后得到了回答并且是一个错误。请考虑此票证信息。
我正在处理地图缩减作业,我想将命令行中的变量传递给地图。这样我就可以通过反射来自动地实例化自定义解析器。但是,实例化该类会导致NPE
MRFileParser.java
主要:
configuration.set("parser","com.example.parsers." + args[0])
在地图中:
Configuration configuration = context.getConfiguration();
String parserClassName = configuration.get("parser");
Class parserClass = Class.forName(parserClassName);
fileParser = (FileParser) parserClass.newInstance()
但是这会引发空指针异常:
attempt_201309161312_0020_m_000000_1: 2013-09-17 11:58:06.770 java[9623:1703] Unable to load realm info from SCDynamicStore
13/09/17 11:58:16 INFO mapred.JobClient: Task Id : attempt_201309161312_0020_m_000000_2, Status : FAILED
java.lang.NullPointerException
at org.apache.hadoop.io.Text.encode(Text.java:388)
at org.apache.hadoop.io.Text.set(Text.java:178)
at com.example.MyMRFileParser$Map.map(MyMRFileParser.java:42)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
我试图动态加载的类被编译到jar中。 FileParser
是定义解析器契约的接口,命令行传入的名称是实现FileParser
接口的类。
我的项目布局如下所示:假设包com.example.someproject.*
├── parsers
│ ├── FileParser.java
│ └── SomeSpecificFormatParser.java
├── mapreduce
│ └── MRFileParser.java
├── model
└──TomeDomainSpecificClass.java
更新:问题结果与下一行record = fileParser.toRecord(line);
有关,解析器将该行解析为记录对象。完全是我的坏。我省略了。
答案 0 :(得分:1)
试试这个: - 1. FileParser类包含在jar文件中。
导出hadoop类路径
导出HADOOP_CLASSPATH = PATH_TO_JAR_FILE
运行map reduce job:
PARAMS = com.example.someproject.FileParser
hadoop jar $ PATH_TO_JAR_FILE com.example.someproject.MRFileParser $ PARAMS
JobRunner。
配置conf = new Configuration(); conf.set(“parser”,args [0]);
Mapper(或reducer):
配置配置= context.getConfiguration();
String parserClassName = configuration.get(“parser”);
类parserClass = Class.forName(parserClassName);
fileParser =(FileParser)parserClass.newInstance()