1

对于storm-starter中的一个简单的字数统计程序,逻辑相当简单:
1)将句子分成单词
2)发出每个单词
3)聚合计数(将计数存储在地图中)

但是这里有两个问题:
1)程序使用12个单独的线程来执行聚合部分,也就是说count不是GLOBAL,我们要多加一层才能得到全局count?
2)在bolt中,maps是用来存储count的,也就是说它有状态,如果当前worker失败了,bolt中存储的count都没有了怎么办?因为storm是无状态的
3)我们应该使用Trident来实现这个吗?

4

1 回答 1

1

每个螺栓包含 1/12 的全局状态单词。字段分组每次将特定单词发送到同一个螺栓,因此计数在全局范围内是准确的。

https://storm.apache.org/documentation/Concepts.html

字段分组:流按分组中指定的字段进行分区。例如,如果流按“user-id”字段分组,具有相同“user-id”的元组将始终执行相同的任务,但具有不同“user-id”的元组可能会执行不同的任务.

是的,如果节点崩溃,计数将会丢失。应根据您的应用程序对不准确性的容忍度和所需的性能特征来使用持久存储。

Trident 可帮助您构建仅执行一次处理的状态(在此示例中计数)。如果示例中的后备图是 HBase,那么它对bolt 崩溃具有弹性,但是当bolt 重新启动时您会丢失数据(尽力处理),或者如果重放句子元组(至少一次处理),您可能会丢失数据. 如果您需要计算一次,Trident 是您的最佳选择。

于 2015-04-12T03:14:37.490 回答