用于从Storm Spout内部读取Kestrel服务器队列的Java客户端库

时间:2014-02-05 14:42:47

标签: apache-storm kestrel

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

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

我添加了提供here的maven绑定。没有使用KestrelThriftSpout喷口,使用Kestrel.Client。编译很好,但我在运行时遇到java.lang.NoClassDefFoundError错误。

STACK TRACE

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

有人可以确认在这种情况下是否可以使用风暴隼?

如果没有,是否有另一个kestrel客户端库建议在风暴喷口中用于从茶隼队列中读取数据?

1 个答案:

答案 0 :(得分:1)

对于最新的更新感到抱歉。

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

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

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

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

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