Apache storm 使用Storm或Trident进行字数计算

Apache storm 使用Storm或Trident进行字数计算,apache-storm,word-count,trident,Apache Storm,Word Count,Trident,对于中的简单字数计算程序,逻辑相当简单: 1) 将句子拆分成单词 2) 发出每个单词 3) 聚合计数(将计数存储在映射中) 然而,这里有两个问题: 1) 程序使用12个单独的线程来执行聚合部分,这意味着计数不是全局的,我们必须再添加一层来获得全局计数 2) 在bolt中,映射用于存储计数,这意味着它具有状态,如果当前工作进程失败,那么bolt中存储的所有计数都将消失?因为风暴是无状态的 3) 我们应该使用三叉戟来实现这一点吗?每个螺栓包含全球状态单词的1/12。字段分组每次都将特定的字发送到同一

对于中的简单字数计算程序,逻辑相当简单:
1) 将句子拆分成单词
2) 发出每个单词
3) 聚合计数(将计数存储在映射中)

然而,这里有两个问题:
1) 程序使用12个单独的线程来执行聚合部分,这意味着计数不是全局的,我们必须再添加一层来获得全局计数
2) 在bolt中,映射用于存储计数,这意味着它具有状态,如果当前工作进程失败,那么bolt中存储的所有计数都将消失?因为风暴是无状态的

3) 我们应该使用三叉戟来实现这一点吗?

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

字段分组:流由中指定的字段进行分区 分组。例如,如果流按“用户id”分组 字段中,具有相同“用户id”的元组将始终转到相同的任务, 但是,具有不同“用户id”的元组可能用于不同的任务

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


Trident帮助您构建只进行一次处理的状态(在本例中计算)。如果示例中的支持映射是HBase,则它将能够抵抗螺栓崩溃,但螺栓重新启动时(尽力而为处理)可能会丢失数据,如果句子元组被重放(至少一次处理),则可能会超过字数。如果你需要数一数,三叉戟是最好的选择

你好,Joshua,谢谢你的回答,我理解了第一个问题,即同一个单词将进入同一个分区以实现全局计数。对于第二个问题,“如果示例中的支持映射是HBase,那么它将对螺栓崩溃具有弹性,但是当螺栓重新启动时,您可能会丢失数据(尽最大努力处理),或者如果句子元组被重放(至少一次处理),则会过多计算单词。”你的意思是,即使使用Trident和HBase备份,我们仍然存在数据丢失/计数过多的问题吗?我自己想,这取决于您使用哪种映射:事务性映射、非事务性映射和不透明映射,基本上是容错和存储成本之间的折衷。在这种情况下,我谈论的是常规风暴,即如何发生不足/过度计数。Trident的不透明和事务性映射状态使用HBase(或其他持久存储)提供一次精确计数。您应该使用哪一个取决于当发生故障时,您的喷口是否能够重放与以前完全相同的消息集。