我有一个风暴拓扑,创造了许多喷口和螺栓。显然,它们将分布在具有自己jvm的各种系统/节点上。
我知道storm将自动管理网络通信,这样由喷口发出的元组将到达另一个jvm上的螺栓。
我不明白的是如何保持一些变量来跟踪事情。
我想要一个变量来计算所有示例处理的元组数 Bolt-A
. 另一个用于计算的变量 Bolt-B
等等。
我还需要一个充当标志的变量,这样我就可以知道喷口何时没有更多的数据要发出,这样bolt就可以开始写入sql了。
我考虑过使用 Redis
,但想知道这是最好的方法还是有其他方法?任何地方都有代码样本吗?我在谷歌上搜索过,但找不到多少有用的信息。
3条答案
按热度按时间z9gpfhce1#
对于第一个需求,您可以使用metrics api(http://storm.apache.org/releases/0.10.1/metrics.html)
对于第二个要求,为什么不发送一个类似于计时器元组的“flush”元组呢?
rqdpfwrv2#
您应该能够从StormUI中获得每个组件以及每个组件的每个示例发出和传输的元组数。甚至还有一个restapi来检索这些值。
ngynwnxp3#
首先,在storm上无法在任务之间共享变量。
您可以定义自己的“control”消息并将其发送给bolts,以知道没有可供spout发出的消息,而不是直接共享标志。
与redis共享状态是一种可能的选择(您需要实现自己的逻辑),但标志值可能会闪烁,因此您可能需要处理它。