关闭tomcat服务器时无法加载org.apache.hadoop.util.ShutdownHookManager

我有一个在tomcat上运行的简单Web应用程序。 此Web应用程序将文件读​​写到HDFS。

我面临的问题是每次使用./bin/shutdown.sh停止服务器时。 我得到无法加载hadoop shutdownHookManagerexception。

我确定hadoop-common(包含ShutDownManager)在tomcat类路径中。

谁能帮我吗?

我得到的例外:

 Oct 14, 2013 5:57:54 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE: The web application [] created a ThreadLocal with key of type [com.ebay.kernel.calwrapper.CalTransactionHelper$1] (value [com.ebay.kernel.calwrapper.CalTransactionHelper$1@3d5a1c5f]) and a value of type [com.ebay.kernel.calwrapper.CalTransactionHelper.Stack] (value [[]]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. Oct 14, 2013 5:57:54 PM org.apache.coyote.AbstractProtocol stop INFO: Stopping ProtocolHandler ["http-bio-8080"] Oct 14, 2013 5:57:54 PM org.apache.coyote.AbstractProtocol stop INFO: Stopping ProtocolHandler ["ajp-bio-8009"] Oct 14, 2013 5:57:54 PM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["http-bio-8080"] Oct 14, 2013 5:57:54 PM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["ajp-bio-8009"] Oct 14, 2013 5:57:54 PM org.apache.catalina.loader.WebappClassLoader loadClass INFO: Illegal access: this web application instance has been stopped already. Could not load org.apache.hadoop.util.ShutdownHookManager$2. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) at org.apache.hadoop.util.ShutdownHookManager.getShutdownHooksInOrder(ShutdownHookManager.java:124) at org.apache.hadoop.util.ShutdownHookManager$1.run(ShutdownHookManager.java:52) Exception in thread "Thread-9" java.lang.NoClassDefFoundError: org/apache/hadoop/util/ShutdownHookManager$2 at org.apache.hadoop.util.ShutdownHookManager.getShutdownHooksInOrder(ShutdownHookManager.java:124) at org.apache.hadoop.util.ShutdownHookManager$1.run(ShutdownHookManager.java:52) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.util.ShutdownHookManager$2 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) ... 2 more 

我在构建的maven Mojo中遇到了同样的问题。 我认为问题是由在Web应用程序中加载hadoop类的上下文类加载器引起的。 WebAppClassLoader类加载器无法看到这些定义。 当JVM关闭时,正在执行关闭挂钩并且调用ShutdownHookManager但它现在已经被破坏的上下文类加载器加载,并且您遇到了问题。

将hadoop jar放在tomcat的lib目录中可能会有所帮助。 或者在启动tomcat时设置一些* _CLASSPATH java选项。 这样,WebAppClassLoader将具有您的类的定义。

否则,您可以在销毁上下文之前手动执行hadoop的关闭挂钩并忽略上述exception。