2015-10-05 97 views
2

将应用程序从2.6.0更新到2.7.1时,我一直无法使我们的映射器作业正常运行,并且出现在作业日志中的内容如下:在Hadoop 2.6.0上启动MRAppMaster到2.7.1升级时出现NoClassDefFoundError

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) 

我最初以为这是专门在我们的工作中一个classpath的问题,为此我们的库复制到分布式缓存,然后添加到作业的各任务正在运行之前的类路径。虽然所有的库都已经存在,并且在作业运行之前添加到类路径中,但验证也证实了一点。

两个hadoop classpathyarn classpath揭示hadoop/share/hadoop下的一切是在类路径,其中包含的lib(log4j的)所讨论的类属的上方。

我们有些出于想法。正在执行的代码在我们的2.6.0分支上工作得很好。我们可能会错过什么?

+0

您是否找到了解决问题的方法?我有完全相同的问题,至今没有运气 – cheseaux

+0

是@cheseaux !!!我会记录一个答案,但是偶然,你是否升级而不编辑/更新你的'hadoop/etc/hadoop/container-log4j.properties'文件? – James

回答

1

因此,这最终成为一个微妙的问题,其中被提供在类路径上,但是当它最初被加载时,它引发了一个null变量,随后的异常/栈可能表明这在Hadoop肠道深处已经丢失了!

在Hadoop 2.7.x中,ContainerLogAppender获得了setContainerLogFile的能力。不幸的是,如果log4j.appender.CLA.containerLogFile=${hadoop.root.logfile}log4j.appender.CRLA.containerLogFile=${hadoop.root.logfile}没有在hadoop/etc/hadoop/container-log4j.properties中设置,那么这与NPE一起爆炸。在此之前它默认为“系统日志”,它现在没有默认值,并且会很乐意让你挖掘出一个洞。因此,当类在classloader加载的同时爆炸时,它们实际上被删除了,因此工作报告NoClassDefFoundErrorClassNotFoundException相反。

+0

刚刚碰到这个,这个固定它。对于搜索引擎果汁来说,你也可能会得到类似于'java.lang.NullPointerException java.util.File。 (File.java:317) at org.apache.hadoop.yarn.ContainerLogAppender.activateOptions(ContainerLogAppender.java:53)',它可以在从早期版本升级到Cloudera CDH 5.8.0时发生。 – blendmaster

0

我认为,因为Hadoop版本2.7.1发布drops support for JDK6 runtime and works with JDK 7+ only您面临的问题可能是由于较旧的sl4j jar。你可以尝试更新sl4j.jar到最新版本。

+0

问题类不是SLF4J,而是Log4J类。这只会是一个问题,如果它是相反的 - 例如类/ lib是使用JDK7编译的,但我们使用的是JDK6。使用使用旧版JDK编译的库是非常好的(也是正常的)。 – James