【问题标题】:Word Count using Storm or Trident使用 Storm 或 Trident 进行字数统计
【发布时间】:2015-04-12 11:14:37
【问题描述】:

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

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

【问题讨论】:

    标签: apache-storm word-count trident


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 您好 Joshua,感谢您的回答,我理解第一个问题是同一个词将进入同一个分区以实现全局计数。对于第二个问题,“如果示例中的后备图是 HBase,那么它对bolt 崩溃具有弹性,但是当bolt 重新启动时您会丢失数据(尽力处理),或者如果句子中的单词数过多元组已重播(至少处理一次)。” 你的意思是即使使用 Trident 和 HBase 备份,我们仍然有数据丢失/溢出?
    • 我自己想通了,这取决于你使用哪种地图:事务性、非事务性和不透明,基本上是容错和存储成本之间的权衡
    • 在这种情况下,我正在谈论常规的 Storm,关于如何发生计数不足/过度计数。 Trident 的 Opaque 和 Transactional 映射状态只提供一次与 HBase(或其他持久存储)的计数。您应该使用哪一个取决于您的 spout 是否可以重播与之前发生故障时完全相同的消息集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多