noclassdeffounderror

u91tlkcl  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(367)

在将应用程序从2.6.0更新到2.7.1时,我无法正确运行Map程序作业,作业日志中出现以下内容:

SEVERE: Error starting MRAppMaster
java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
    at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:64)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:285)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:305)
    at org.apache.hadoop.security.authentication.util.KerberosName.<clinit>(KerberosName.java:43)
    at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:275)
    at org.apache.hadoop.security.UserGroupInformation.setConfiguration(UserGroupInformation.java:311)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.initAndStartAppMaster(MRAppMaster.java:1492)
    at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java:1448)

我最初认为这是一个类路径问题,特别是在我们的作业中,我们的lib被复制到分布式缓存中,然后在每个作业运行之前添加到作业的类路径中。不过,经过一点验证,确认所有lib都已就位,并在运行作业之前添加到类路径中。
两者 hadoop classpath 以及 yarn classpath 揭示一切 hadoop/share/hadoop 位于类路径上,其中包含所讨论的类所属的lib(log4j)。
我们有点没主意了。正在执行的代码在我们的2.6.0分支上运行得非常好。我们错过了什么?

3vpjnl9f

3vpjnl9f1#

因此,这最终是一个微妙的问题,在类路径上提供了所讨论的类,但是当它最初被加载时,由于它引用了一个空变量而爆炸了,随后的异常/堆栈跟踪表明它在hadoop的内部深处丢失了!
在hadoop2.7.x中,containerlogappender获得了设置containerlogfile的能力。不幸的是,如果 log4j.appender.CLA.containerLogFile=${hadoop.root.logfile} 以及 log4j.appender.CRLA.containerLogFile=${hadoop.root.logfile} 未设置为 hadoop/etc/hadoop/container-log4j.properties ,然后npe就爆炸了。以前它默认为“syslog”,现在它没有默认值,很高兴让你自己挖一个洞。因此,当类在被类加载器加载时爆炸时,它们实际上被删除了,因此为什么作业报告会更进一步呢 NoClassDefFoundError 相对于 ClassNotFoundException .

qacovj5a

qacovj5a2#

我认为,因为hadooprelease2.7.1版本放弃了对jdk6运行时的支持,并与jdk7+一起工作,所以您面临的问题可能是因为旧的sl4jjar。你能试着把sl4j.jar更新到最新版本吗。

相关问题