我正在试验Storm和Trident这个项目,我正在使用Clojure和Marceline这样做。我正在尝试扩展the Marceline page上给出的wordcount示例,这样句子喷口来自DRPC调用,而不是来自本地喷口。我遇到的问题源于DRPC流需要返回客户端的事实,但我希望DRPC调用能够有效地返回null,并简单地更新持久数据。
(defn build-topology
([]
(let [trident-topology (TridentTopology.)]
(let [
;; ### Two alternatives here ###
;collect-stream (t/new-stream trident-topology "words" (mk-fixed-batch-spout 3))
collect-stream (t/drpc-stream trident-topology "words")
]
(-> collect-stream
(t/group-by ["args"])
(t/persistent-aggregate (MemoryMapState$Factory.)
["args"]
count-words
["count"]))
(.build trident-topology)))))
代码中有两种替代方案 - 使用固定批量喷口加载没有问题,但是当我尝试使用DRPC流加载代码时,我收到此错误:
InvalidTopologyException(msg:Component: [b-2] subscribes from non-existent component [$mastercoord-bg0])
我认为这个错误来自于DRPC流必须尝试订阅输出才能返回客户端 - 但persistent-aggregate
不提供任何此类输出来订阅
那么如何设置我的拓扑以便DRPC流导致我的持久数据被更新?
次要更新:看起来可能无法实现:{https://issues.apache.org/jira/browse/STORM-38