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

标签 java tomcat hadoop shutdown-hook

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

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

我确定 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 关闭时,正在执行关闭 Hook 并调用 ShutdownHookManager 但它已加载到现在已销毁的上下文类加载器中,这就是问题所在。

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

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

关于java - 关闭 tomcat 服务器时无法加载 org.apache.hadoop.util.ShutdownHookManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19388201/

相关文章:

java - 将语音识别限制为字母数字词

java - 上传两个文件和一个对象失败并出现错误 415

tomcat webapp 文件夹名称已更改

java - 在 Hibernate 中处理竞争条件

hadoop - 在 Flume 中,文件 channel 的 channel 容量到底意味着什么?

hadoop - 如何在HDFS上的文件夹下的所有叶节点中合并小文件

java - Spark 流输出未保存到 HDFS 文件

java - 在 Kotlin 代码之间编写 java 代码

java - 自动编译线程类中的类。请解释

java - LIMIT_BUFFER=true 标志在 Tomcat 中的作用