对于storm-starter中的简单字数统计程序,逻辑相当简单:
1)将句子分成单词
2)发出每个字
3)聚合计数(将计数存储在地图中)
然而,这里有两个问题:
1)程序使用12个单独的线程来执行聚合部分,这意味着计数不是GLOBAL,我们必须再添加一个层来获取全局计数?
2)在螺栓中,地图用于存储计数,这意味着它具有状态,如果当前工人失败,那么存储在螺栓中的所有计数都消失了?因为风暴是无国籍的
3)我们应该使用Trident来实现这一目标吗?
答案 0 :(得分:1)
每个螺栓包含全局状态的1/12字。字段分组每次都会将特定字发送到同一个螺栓,因此计数在全局范围内都是准确的。
https://storm.apache.org/documentation/Concepts.html
字段分组:流按照中指定的字段进行分区 分组。例如,如果流按“user-id”分组 字段,具有相同“user-id”的元组将始终执行相同的任务, 但是具有不同“用户ID”的元组可能会执行不同的任务。
是的,如果节点崩溃,计数将丢失。应根据应用程序对不准确性和所需性能特征的容忍度使用持久存储。
Trident帮助您构建完成一次处理的状态(在此示例中计算)。如果示例中的支持映射是HBase,它对于螺栓崩溃是有弹性的,但是当螺栓重新启动时会丢失数据(尽力处理),或者如果重放句子元组,则会丢失计数单词(至少一次处理) 。如果您需要计算一次,Trident就是您要走的路。