【问题标题】:Java client library for reading from Kestrel server Queue from within Storm Spout用于从 Storm Spout 中读取 Kestrel 服务器队列的 Java 客户端库
【发布时间】:2014-03-02 01:34:15
【问题描述】:

我已经设置了一个 Kestrel 服务器,并且能够通过 python pykestrel 库设置和使用队列。

我们有一个场景,python 客户端写入 Kestrel 队列,Storm spout 需要从队列中读取。 我尝试使用storm-kestrel 库,但遇到了问题。谷歌搜索似乎表明它不支持 memcache 端口 (22133)。

我已经添加了 here 提供的 maven 绑定。没有使用 KestrelThriftSpout 喷口,而是使用 Kestrel.Client。编译没问题,但运行时出现 java.lang.NoClassDefFoundError 错误。

堆栈跟踪

1098 [main] ERROR org.apache.zookeeper.server.NIOServerCnxn  - Thread Thread[main,5,main] died
java.lang.NoClassDefFoundError: Lnet/lag/kestrel/thrift/Kestrel$Client;
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2397)
    at java.lang.Class.getDeclaredField(Class.java:1946)
    at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1659)
    at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:72)
    at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:480)
    at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:468)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:468)
    at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:365)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1133)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    at backtype.storm.utils.Utils.serialize(Utils.java:52)
    at backtype.storm.topology.TopologyBuilder.createTopology(TopologyBuilder.java:94)
    at com.rr.storm.ArticleTolopolgy.main(ArticleTolopolgy.java:35)
Caused by: java.lang.ClassNotFoundException: net.lag.kestrel.thrift.Kestrel$Client
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 15 more

有人可以确认storm-kestrel是否可以在这种情况下使用吗?

如果没有,是否有另一个 kestrel 客户端库被推荐在 Storm spout 中用于从 kestrel 队列中读取数据?

【问题讨论】:

  • 能否请您发布您收到的错误消息?
  • 您是如何配置 Spout 以从 Kestrel 读取数据的?
  • 我按照此处的说明将绑定添加到 maven:github.com/nathanmarz/storm-kestrel。它编译得很好,但在运行时会出现可怕的 Java NoClassDefFound 错误。我是 Storm 和 Java 的新手,所以故障排除很困难。
  • 说真的,如果没有堆栈跟踪(合理的)和您的 Spout,我将无能为力
  • 我会在我重新开始工作时添加这些内容。我假设您是说storm-kestrel 库适用于这种情况,这只是我这边的一个错误?谢谢凯龙星。

标签: apache-storm kestrel


【解决方案1】:

抱歉更新晚了。

  • java.lang.NoClassDefFoundError 是因为某些 JAR 不在类路径中。涉及多个依赖项,因此我们通过将所有依赖项打包到一个 JAR 中来解决问题。有几个依赖冲突需要解决,尤其是。一个令人讨厌的涉及 AWS SQS 和风暴取决于不同的 httpclient 库。在发布时需要将 AWS SQS Java 开发工具包版本降级到 1.4.7,而不是最新的 1.7.2。

  • 看起来storm-kestrel 库不再适用于 kestrel 服务器,但如果理解有误,其他人可以纠正。

  • pykestrel用于Python客户端,效果很好。

  • simple-kestrel-client 用于Java kestrel 客户端(Storm spout),效果很好

  • 由于冲突,AWS SQS 使用 Java SDK v1.4.7,效果很好。

【讨论】:

  • 我们通过 thrift 使用 Storm-kestrel 0.7.2-SNAPSHOT 和 kestrel 2.4.1,没有任何问题。
  • 谢谢安吉洛。应该更清楚。我正在寻找 memcached 客户端,但无法让它工作。
猜你喜欢
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多