我正在尝试设置Storm以聚合流,但在同一个流上使用各种(DRPC可用)指标。
E.g。流由包含发件人,收件人,邮件到达的通道以及传递邮件的网关的邮件组成。我无法决定如何组织一个或多个可以给我提供的拓扑结构。网关和/或通道的消息总数。除了总数之外,每分钟的计数也会很好。
基本思想是拥有一个接受消息传递事件的spout,然后根据需要聚合数据。目前我正在玩Trident和DRPC,我已经提出了两种可能的拓扑结构来解决这个问题。无法确定哪种方法更好,如果有的话?!
此 gist 提供了整个来源。 它有三个类:
现在,针对问题和疑问:
我想这是一个很长的问题/话题,但是真的很感激任何帮助! 此外,如果我完全错过了这个架构,那么关于如何实现这一点的建议将是最受欢迎的。 在此先感谢: - )
答案 0 :(得分:0)
您无法通过使用相同的spout实例调用SeparateTopology
来实际拆分newStream()
中的流,因为这会创建相同RandomMessageSpout
spout的新实例,这会导致由多个单独的spout实例发送到拓扑的重复值。 (Spout并行化只能在具有分区喷口的Storm中实现,其中每个喷口实例处理整个数据集的分区 - 例如Kafka分区。)
此处的正确方法是修改CombinedTopology
,根据需要为您需要的每个指标将流拆分为多个流(请参见下文),然后按该指标的字段groupBy()
执行persistentAggregate()
{1}}在每个新分支的流上。
来自Trident常见问题解答,
“each”返回一个Stream对象,您可以将其存储在变量中。然后,您可以在同一个Stream上运行多个each以将其拆分,例如:
Stream s = topology.each(...).groupBy(...).aggregate(...) Stream branch1 = s.each(...) Stream branch2 = s.each(...)
请参阅Storm邮件列表中的this thread和this one以获取更多信息。