java - Hadoop Mapreduce MultipleInputs 无法加载映射器类

标签 java hadoop mapreduce hadoop-yarn

我在我们的 Yarn 集群上使用新的 MapReduce Api。我需要从两个不同的目录中读取两种不同格式的文件。为此,我决定使用 MultipleInputs 来指定两个映射器类。以下是我的工作驱动程序

Job job = new Job(new Configuration(), "Daily Report");

job.setJarByClass(MyDailyJob.class);

MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, Record1ParsingMapper.class);
MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, Record2ParsingMapper.class);


FileOutputFormat.setOutputPath(job, new Path(args[2]));

job.setReducerClass(ReportParsingReducer.class);
job.setNumReduceTasks(10);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);

return (job.waitForCompletion(true) ? 0 : 1); 

My Mappers 具有以下定义:
公共(public)类 Record1ParsingMapper 扩展 Mapper

当我运行这项工作时,我得到以下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:1986)
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1951)
    at org.apache.hadoop.mapreduce.lib.input.MultipleInputs.getMapperTypeMap(MultipleInputs.java:141)
    at org.apache.hadoop.mapreduce.lib.input.DelegatingInputFormat.getSplits(DelegatingInputFormat.java:60)
    at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:498)
    at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:515)
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:399)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1295)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1292)
    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:1614)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1292)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1313)
    at main.java.com.adnear.mr.jobs.MyDailyJob.run(MyDailyJob.java:70)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
    at main.java.com.adnear.mr.jobs.MyDailyJob.main(MyDailyJob.java:226)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

Caused by: java.lang.ClassNotFoundException: org.json.simple.parser.ParseException\

看起来它在以下语句中的 Configuration 类中的 getClassByName() 方法内失败。
clazz = Class.forName(name, true, classLoader);

我正确指定了 Mapper 类的路径。有人可以解释一下导致此类加载异常的原因吗?

谢谢,
开发

最佳答案

Caused by: java.lang.ClassNotFoundException: org.json.simple.parser.ParseException

错误消息清楚地指出类路径中缺少某些类。这个类是 json-simple-1.1.1.jar 的一部分运行时需要 jar 文件来执行 Job .所以在类路径中添加这个jar文件以成功运行Job。
您可以从 HERE 获取 jar 文件.
希望能帮助到你!

关于java - Hadoop Mapreduce MultipleInputs 无法加载映射器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27202190/

相关文章:

xml - 如何在Hive中使用横向 View explode 以获取XML数据格式?

java - 在单个 map 功能中精心制作多行

java - 线程 "main"java.lang.IllegalArgumentException : Wrong FS: expected: file:///中的异常

python - 合并 MapReduce 作业的输出文件

javascript - 在 MongoDb 中使用 mapReduce 获取文档(行)计数

java - 何时使用convertRowIndexToModel

java - 连接到 Ldap

java - 将组件设置在页面中心

java - 服务中的 Android BroadcastReceiver 在向其发送广播时给出空指针异常

apache-spark - 我的PySpark作业在本地模式下运行良好,但在群集模式下失败-已解决