>我定义了一个计算特定阈值的螺栓。螺栓正在接收字段的多个值的数据。我是否可以为字段的特定值保留变量的值/状态。
假设我有两组元组输入 s$tuple$input:
s$id = "21343254545454354343" s$id="45645465645456561234"
s$tuple$input = ["ABC",2] s$tuple$input= ["CDE",5]
是否可以保留变量的值,例如"ABC"的 counter=5 和"CDE"的 counter=9,并且仅在收到相应 id 的元组时才更新它们。
我没有玩过 Storm 和 R,但希望这些想法与 Java 相似。
有几个选项可用于存储状态:
- 在工人内存中(每个螺栓)
- 外部存储(不在风暴内)
选择什么取决于你的要求,但让我们假设你只是想数字,并不真正关心工人是否死亡。为此,实现很简单。只需在 bolt 中创建一个私有变量并跟踪即可。
例如,假设您有一个计数变量:
Map<String, Integer> counts = new HashMap<String, Integer>();
然后,在 bolt 的执行方法中,您只需检查之前是否得到过这个词,如果是,则增加计数:
Integer count = counts.get(word);
if (count == null)
count = 0;
count++;
counts.put(word, count);
来源:WordCountBolt.java
您还需要考虑元组如何流向辅助角色。您可能不想再使用随机分组了。相反,您希望按 ID 进行字段分组,以便具有相同 ID 的元组转到相同的 bolt。
展望未来,您可能想要更耐用的东西(因此,如果您失去了工人,那么您不会丢失所有计数),因此您可能会将计数存储在HBase之类的东西中。