5

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
4

1 に答える 1

2

私が構築しているmaven Mojoでも同じ問題があります。この問題は、Web アプリケーションに Hadoop クラスをロードするコンテキスト クラス ローダーが原因であると考えられます。これらの定義は、WebAppClassLoader クラス ローダーからは見えません。JVM のシャットダウンが発生すると、シャットダウン フックが実行され、ShutdownHookManager が呼び出されますが、破棄されたコンテキスト クラス ローダーに読み込まれ、問題が発生します。

tomcat の lib ディレクトリに Hadoop jar を配置すると、おそらく役に立ちます。または、Tomcat の起動時に *_CLASSPATH Java オプションを設定します。そうすれば、WebAppClassLoader にクラスの定義が含まれます。

それ以外の場合は、コンテキストを破棄して上記の例外を無視する前に、hadoop のシャットダウン フックを手動で実行できます。

于 2013-11-19T18:06:10.957 に答える