问题的简短版本:如何在Twitter Storm中构建故障安全字数统计程序(拓扑),即使发生故障,也能产生准确结果?这甚至可能吗?
长版:我正在研究Twitter Storm,并试图了解它应该如何使用。我已经跟随tutorial并发现它是一个非常简单的概念。但是本教程中概述的单词计数示例不具有容错能力(因为 bolt 将一些数据保存在内存中)。如果将事件重新提交到链的开头(当某些 bolt 失败时发生),则会在后端DB中保存相同的数据会导致重复计算。
我是否应该将Twitter Storm视为生成部分准确结果的实时平台,并依然依赖MapReduce来获得准确的结果?
答案 0 :(得分:2)
这实际上取决于你试图反对什么样的失败。您可以做一些事情:
风暴螺栓只有在处理后才会产生元组。如果您编写了您的喷口和螺栓以及拓扑结构来使用它,您可以实施“一次性”系统,以确保准确性。
Kafka可以成为将数据放入Storm的好方法,因为它使用磁盘持久性来保持消息长时间消耗。这意味着如果消费者在线下发生故障,您可以检索它们。
一般来说,很难保证在任何流媒体系统中只处理一次。这是一个已知问题,有效解决这个问题非常困难。
答案 1 :(得分:0)
Storm具有事务拓扑的概念。实际上,这意味着您需要批量处理项目,然后在批处理结束时提交到数据库,将事务ID与计数一起存储在数据库中。这也有减少数据库负载的实际好处。
批处理是并行处理的,可能会在失败时重播,但保证按顺序提交。这很重要,因为它可以安全地编写获取当前计数行的代码,检查内存中的事务ID,如果两者不同(意味着它是未提交的批处理),则将新计数添加到现有计数行并提交更新的计数。
有关更多信息和代码示例,请参阅以下链接:
https://github.com/nathanmarz/storm/wiki/Transactional-topologies