-1

我按照http://stormcrawler.net/getting-started/指南生成拓扑的 jar 文件。当我在readme文件中使用storm命令运行拓扑时,在执行 FetcherBolt 时出现以下错误。我在 Hortonworks 集群中安装了 Storm Storm 1.1.0.2.6.4.0-91。无论 -local 或分布式模式如何,我都会遇到相同的异常。我得到以下异常

java.lang.NoSuchMethodError: org.apache.commons.logging.impl.LogFactoryImpl.handleThrowable(Ljava/lang/Throwable;)V 在 org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:568) 在org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:292) 在 org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:269) 在 org.apache.commons.logging。 LogFactory.getLog(LogFactory.java:685) 在 org.apache.http.conn.ssl.AbstractVerifier.(AbstractVerifier.java:61) 在 org.apache.http.conn.ssl.AllowAllHostnameVerifier.(AllowAllHostnameVerifier.java:44)在 org.apache.http.conn.ssl.AllowAllHostnameVerifier.(AllowAllHostnameVerifier.java:46) 在 org.apache.http.conn.ssl.SSLConnectionSocketFactory.(SSLConnectionSocketFactory.java:146) 在 org.apache.http.impl.conn .PoolingHttpClientConnectionManager。getDefaultRegistry(PoolingHttpClientConnectionManager.java:115) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:122) at com.digitalpebble.stormcrawler.protocol.httpclient.HttpProtocol.(HttpProtocol.java:76) at java .lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.digitalpebble.stormcrawler.protocol.ProtocolFactory.(ProtocolFactory.java:60) at com.digitalpebble.stormcrawler。 bolt.FetcherBolt.prepare(FetcherBolt.java:738) at org.apache.storm.daemon.executor$fn__9635$fn__9648.invoke(executor.clj:794) at org.apache.storm.util$async_loop$fn__557.invoke( util.clj:482) 在 clojure.lang.AFn.run(AFn.java:22) 在 java.lang.Thread.run(Thread.java:748)(PoolingHttpClientConnectionManager.java:122) 在 com.digitalpebble.stormcrawler.protocol.httpclient.HttpProtocol.(HttpProtocol.java:76) 在 java.lang.Class.forName0(Native Method) 在 java.lang.Class.forName(Class. java:264) 在 com.digitalpebble.stormcrawler.protocol.ProtocolFactory.(ProtocolFactory.java:60) 在 com.digitalpebble.stormcrawler.bolt.FetcherBolt.prepare(FetcherBolt.java:738) 在 org.apache.storm.daemon。 executor$fn__9635$fn__9648.invoke(executor.clj:794) at org.apache.storm.util$async_loop$fn__557.invoke(util.clj:482) at clojure.lang.AFn.run(AFn.java:22)在 java.lang.Thread.run(Thread.java:748)(PoolingHttpClientConnectionManager.java:122) 在 com.digitalpebble.stormcrawler.protocol.httpclient.HttpProtocol.(HttpProtocol.java:76) 在 java.lang.Class.forName0(Native Method) 在 java.lang.Class.forName(Class. java:264) 在 com.digitalpebble.stormcrawler.protocol.ProtocolFactory.(ProtocolFactory.java:60) 在 com.digitalpebble.stormcrawler.bolt.FetcherBolt.prepare(FetcherBolt.java:738) 在 org.apache.storm.daemon。 executor$fn__9635$fn__9648.invoke(executor.clj:794) at org.apache.storm.util$async_loop$fn__557.invoke(util.clj:482) at clojure.lang.AFn.run(AFn.java:22)在 java.lang.Thread.run(Thread.java:748)Stormcrawler.protocol.ProtocolFactory.(ProtocolFactory.java:60) at com.digitalpebble.stormcrawler.bolt.FetcherBolt.prepare(FetcherBolt.java:738) at org.apache.storm.daemon.executor$fn__9635$fn__9648.invoke(executor .clj:794) 在 org.apache.storm.util$async_loop$fn__557.invoke(util.clj:482) 在 clojure.lang.AFn.run(AFn.java:22) 在 java.lang.Thread.run(线程.java:748)Stormcrawler.protocol.ProtocolFactory.(ProtocolFactory.java:60) at com.digitalpebble.stormcrawler.bolt.FetcherBolt.prepare(FetcherBolt.java:738) at org.apache.storm.daemon.executor$fn__9635$fn__9648.invoke(executor .clj:794) 在 org.apache.storm.util$async_loop$fn__557.invoke(util.clj:482) 在 clojure.lang.AFn.run(AFn.java:22) 在 java.lang.Thread.run(线程.java:748)

4

1 回答 1

0

这可能是由于从 httpclient 库继承的 commons-logging 版本与由 Hortonworks 版本的 Apache Storm 放在类路径中的版本之间存在冲突。

[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.3:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.4.6:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  \- commons-codec:commons-codec:jar:1.9:compile

您可以通过设置尝试使用不同的协议实现

  http.protocol.implementation: "com.digitalpebble.stormcrawler.protocol.okhttp.HttpProtocol"
  https.protocol.implementation: "com.digitalpebble.stormcrawler.protocol.okhttp.HttpProtocol"

在 crawler-conf.yaml 文件中。请注意,这并不能保证对 commons-logging 的调用不会发生在其他地方。理想情况下,您希望解决依赖问题,例如确保 Hortonworks 使用与 StormCrawler 所需的版本相同的版本。我们仅支持 Storm 的 Apache 发行版。

于 2018-04-06T14:31:49.983 回答