【问题标题】:ClassNotFoundException while running a jar though it contails all tha classes运行 jar 时出现 ClassNotFoundException,尽管它包含所有类
【发布时间】:2016-07-26 13:48:51
【问题描述】:

我使用eclipsemapreduce 作业创建了一个jar。如果您提取jar,您可以看到那里的所有课程。当您在hadoop``usinghadoop` 命令中run jar 时,它会显示如下所示的错误。

它不能只识别一个类,即Test_project$TwoDArrayWritablesTest_projectmain 类,TwoDArrayWritablesclass 内的 Test_projectTwoDArrayWritables继承TwoDArrayWritablehadoop中的内置类。

Jar 提取图像:

错误:

16/04/05 15:48:28 INFO mapred.JobClient: Task Id : attempt_201604051120_0002_m_000000_1, Status : FAILED
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: mapreduce.Test_project$TwoDArrayWritables
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:889)
    at org.apache.hadoop.mapred.JobConf.getMapOutputValueClass(JobConf.java:747)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:966)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:422)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:366)
    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:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: mapreduce.Test_project$TwoDArrayWritables
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:881)
    ... 9 more
Caused by: java.lang.ClassNotFoundException: mapreduce.Test_project$TwoDArrayWritables
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:810)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:855)
    ... 10 more

16/04/05 15:48:34 INFO mapred.JobClient: Task Id : attempt_201604051120_0002_m_000000_2, Status : FAILED
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: mapreduce.Test_project$TwoDArrayWritables
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:889)
    at org.apache.hadoop.mapred.JobConf.getMapOutputValueClass(JobConf.java:747)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:966)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:422)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:366)
    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:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: mapreduce.Test_project$TwoDArrayWritables
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:881)
    ... 9 more
Caused by: java.lang.ClassNotFoundException: mapreduce.Test_project$TwoDArrayWritables
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:810)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:855)
    ... 10 more

谷歌搜索了许多解决方案,但没有任何效果。请帮忙!

【问题讨论】:

  • 你能提供你用来运行jar的完整命令吗..
  • 这是我使用的命令- bin/hadoop jar newproj.jar /user/hduser/input /user/hduser/output
  • 试试这个可能:bin/hadoop jar newproj.jar /user/hduser/input /user/hduser/output
  • 语法为:hadoop jar [mainClass]
  • 在导出可执行文件jar 时可能会出现问题,在此过程中有一个选项可以识别包含实际main() 方法的类。在从源代码中导出 jar 的过程中,你选择了你的类(其中包含 main 方法)吗??

标签: java eclipse hadoop jar mapreduce


【解决方案1】:

试试这个:bin/hadoop jar /path/to/jarfile/newproj.jar Test_project.TwoDArrayWritables /user/hduser/input /user/hduser/output1

【讨论】:

  • 虽然此代码可以回答问题,但提供有关它为什么和/或如何回答问题的额外上下文将显着提高其长期价值。请编辑您的答案以添加一些解释。
  • 在尝试您提出的解决方案时,会抛出错误-INFO mapred.JobClient: Cleaning up the staging area hdfs://master:54310/app/hadoop/tmp/mapred/staging/hduser/.staging/job_201604070951_0001 16/04/07 09:57:01 ERROR security.UserGroupInformation: PriviledgedActionException as:hduser cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://master:54310/user/hduser/input already exists Output directory hdfs://master:54310/user/hduser/input already exists
  • @gariepy 我猜它并没有将 Test_project.TwoDArrayWritables 作为一个类,而是将所有内容用于 eaxample - Test_project.TwoDArrayWritables 被作为输入, /user/hduser/input 作为输出目录等等。
  • @Farheen Nilofer 请在运行作业之前删除您提供的输出目录或尝试使用新的 o/p 目录
  • @Ashok,输出文件已经被删除,如果我们要添加一个类名的参数,它是以输入文件作为输出。
【解决方案2】:

挣扎了大约几个星期,我的脑海中突然出现了一些东西,即 我在工作中使用了两个减速器,因此为每个定义了两个 Jobconf:

我之前的(错误代码)

JobConf conf = new JobConf(getConf(), Test_project.class); JobConf conf2 = new JobConf(getConf());

因为我认为配置已经定义,所以在 conf2

中没有提到类 Test_project.class

我的礼物(正确代码)

JobConf conf = new JobConf(getConf(), Test_project.class); JobConf conf2 = new JobConf(getConf(), Test_project.class);

抛出错误是因为在执行时它正在搜索 Test_project$TwoDArrayWritables ,因为它没有 Test_project.class 类,它无法找到 TwoDArrayWritables

现在可以正常使用了。

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 2018-01-20
    • 1970-01-01
    • 2013-04-26
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2019-09-08
    相关资源
    最近更新 更多