HADOOP - 如何在map中动态加载类



请注意,这个问题经过一些仔细的审查后自行回答,是一个错误。 请考虑此票证的信息。

我正在从事一个地图缩减工作,我想将变量从命令行传递到地图。 这样我就可以通过反射日间实例化自定义解析器。 但是,实例化类会导致 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

└── SomeDomainSpecificClass.java

更新:问题原来与下一行有关,record = fileParser.toRecord(line);解析器将行解析为记录对象。 完全是我的错。 我省略了这一点。

试试这个:-1. 类文件解析器包含在 jar 文件中。

  1. 导出 hadoop 类路径

    导出HADOOP_CLASSPATH=PATH_TO_JAR_FILE

  2. 运行地图缩减作业:

    PARAMS=com.example.someproject.FileParser

    hadoop jar $PATH_TO_JAR_FILE com.example.someproject.MRFileParser $PARAMS

  3. 乔布斯跑者。

    配置 conf = new Configuration();conf.set("parser", args[0]);

  4. 映射器(或减速器):

    配置配置 = context.getConfiguration();

    字符串解析器类名 = configuration.get("parser");

    Class

    parserClass = Class.forName(parserClassName);

    fileParser = (FileParser) parserClass.newInstance()

相关内容

  • 没有找到相关文章