使用 Storm 或 Trident 的字数统计
Word Count using Storm or Trident
对于 storm-starter 中的简单字数统计程序,逻辑相当简单:
1) 将句子拆分成单词
2) 发出每个单词
3)汇总计数(将计数存储在地图中)
但是,这里有两个问题:
1)程序使用了12个单独的线程来执行聚合部分,这意味着计数不是全局的,我们必须再加一层才能得到全局计数?
2)在bolt中,maps是用来存储count的,也就是说它是有状态的,如果当前worker失败了,bolt中存储的所有counts都没有了怎么办?因为风暴是无状态的
3) 我们应该改用 Trident 来实现吗?
每个螺栓包含全局状态单词的 1/12。字段分组每次都会将特定单词发送到同一个螺栓,因此全局计数都是准确的。
https://storm.apache.org/documentation/Concepts.html
Fields grouping: The stream is partitioned by the fields specified in
the grouping. For example, if the stream is grouped by the "user-id"
field, tuples with the same "user-id" will always go to the same task,
but tuples with different "user-id"'s may go to different tasks.
是的,如果节点崩溃,计数将会丢失。应根据您的应用程序对不准确性的容忍度和所需的性能特征来使用持久性存储。
Trident 可帮助您构建仅执行一次处理的状态(在此示例中计算)。如果示例中的支持映射是 HBase,它对螺栓崩溃具有弹性,但是当螺栓重新启动时您会丢失数据(尽力而为处理),或者如果句子元组被重放(至少处理一次),您将丢失数据.如果您需要对事物进行一次计数,那么三叉戟就是您的不二之选。
对于 storm-starter 中的简单字数统计程序,逻辑相当简单:
1) 将句子拆分成单词
2) 发出每个单词
3)汇总计数(将计数存储在地图中)
但是,这里有两个问题:
1)程序使用了12个单独的线程来执行聚合部分,这意味着计数不是全局的,我们必须再加一层才能得到全局计数?
2)在bolt中,maps是用来存储count的,也就是说它是有状态的,如果当前worker失败了,bolt中存储的所有counts都没有了怎么办?因为风暴是无状态的
3) 我们应该改用 Trident 来实现吗?
每个螺栓包含全局状态单词的 1/12。字段分组每次都会将特定单词发送到同一个螺栓,因此全局计数都是准确的。
https://storm.apache.org/documentation/Concepts.html
Fields grouping: The stream is partitioned by the fields specified in the grouping. For example, if the stream is grouped by the "user-id" field, tuples with the same "user-id" will always go to the same task, but tuples with different "user-id"'s may go to different tasks.
是的,如果节点崩溃,计数将会丢失。应根据您的应用程序对不准确性的容忍度和所需的性能特征来使用持久性存储。
Trident 可帮助您构建仅执行一次处理的状态(在此示例中计算)。如果示例中的支持映射是 HBase,它对螺栓崩溃具有弹性,但是当螺栓重新启动时您会丢失数据(尽力而为处理),或者如果句子元组被重放(至少处理一次),您将丢失数据.如果您需要对事物进行一次计数,那么三叉戟就是您的不二之选。