#Storm:如何为同一数据源设置各种指标

时间:2013-09-26 13:49:11

标签: apache-storm

我正在尝试设置Storm以聚合流,但在同一个流上使用各种(DRPC可用)指标。

E.g。流由包含发件人,收件人,邮件到达的通道以及传递邮件的网关的邮件组成。我无法决定如何组织一个或多个可以给我提供的拓扑结构。网关和/或通道的消息总数。除了总数之外,每分钟的计数也会很好。

基本思想是拥有一个接受消息传递事件的spout,然后根据需要聚合数据。目前我正在玩Trident和DRPC,我已经提出了两种可能的拓扑结构来解决这个问题。无法确定哪种方法更好,如果有的话?!

gist 提供了整个来源。 它有三个类:

  • RandomMessageSpout
    • 用于发出消息传递数据
    • 模拟真实数据源
  • SeparateTopology
    • 为每个需要的指标创建单独的DRPC流
    • 还为每个指标
    • 创建单独的查询状态
    • 他们都使用相同的spout实例
  • CombinedTopology
    • 创建一个包含所有指标的单一DRPC流
    • 为每个指标
    • 创建单独的查询状态
    • 每个查询状态都会提取所需的指标并为其分组结果

现在,针对问题和疑问:

  • SeparateTopology
    • 是否有必要使用相同的spout实例,或者我每次只能说新的RandomMessageSpout()?
    • 我喜欢这样的想法,即我不需要按照所有指标来保持分组数据,而只需要我们稍后需要提取的分组
    • 是由所有状态/查询组合实际处理的喷口发射数据,例如,不是第一个来的?
    • 以后是否也可以在运行时动态添加新的状态/查询组合?
  • CombinedTopology
    • 我真的不喜欢我需要保留按所有指标分组的数据的想法,因为我不需要所有的组合
    • 令人惊讶的是,所有指标始终返回相同的数据
      • e.g。渠道和网关查询返回状态指标数据
      • 我发现这始终是按state definition
      • 中第一个字段分组的数据
      • this topic解释了此行为背后的原因
      • 但是我想知道这是否是一个很好的方法(如果需要的话,会找到解决这个问题的方法)。
  • 状态查询中的SnapshotGet与TupleCollectionGet
    • SnapshotGet事情往往有效,但并非总是如此,只有TupleCollectionGet解决了这个问题
    • 关于这样做的正确方法的任何指示?

我想这是一个很长的问题/话题,但是真的很感激任何帮助! 此外,如果我完全错过了这个架构,那么关于如何实现这一点的建议将是最受欢迎的。 在此先感谢: - )

1 个答案:

答案 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 threadthis one以获取更多信息。