2013-09-26 33 views
2

我试图设置Storm来聚合一个流,但是在同一个流上有各种(DRPC可用)指标。#Storm:如何为同一个数据源设置各种指标

E.g.该流包括具有发送者,接收者,消息到达的信道和通过其传送的网关的消息。我无法决定如何组织一个或多个可以给我的拓扑结构,例如网关和/或通道的消息总数。除了总数外,每分钟计数也会很好。

基本思想是让喷嘴接受消息事件,并根据需要汇总数据。目前,我正在与Trident和DRPC一起玩耍,并且我已经提出了两种可能的拓扑结构,可以在此阶段解决问题。无法确定哪种方法更好,如果有的话?

整个来源可在此gist。 它有三个类:

  • RandomMessageSpout
    • 用于发射所述消息数据
    • 模拟真实数据源
  • SeparateTopology
    • 创建一个单独的DRPC流对于每个度量需要
    • 还一个单独的查询状态针对每个指标
    • 他们都使用相同的喷口实例
  • CombinedTopology
    • 创建具有所有度量的单个DRPC流创建需要
    • 为每个度量创建一个单独的查询状态
    • 每个查询状态提取所需的度量和组re sults它

现在,针对存在的问题和疑问:

  • SeparateTopology
    • 是否有必要使用相同的壶嘴实例或者我只能说新RandomMessageSpout( ) 每一次?
    • 我喜欢这样的想法,我不需要坚持所有指标的分组数据,只是我们需要提取的分组
    • 是由所有状态/查询组合实际处理的喷口发射的数据,例如,不是第一个来的?
    • 这是否也会稍后在运行时动态添加新的状态/查询组合?
  • CombinedTopology
    • 我真的不喜欢,我需要,因为我并不需要所有
    • 它出乎组合坚持所有的指标划分数据的想法,所有指标总是返回相同的数据
      • 例如通道和网关查询返回状态的指标数据
      • 我发现这是总是第一个字段分组的数据state definition
      • this topic解释这种行为背后
      • 但我想知道的理由,如果这是一个好办法在第一个地方做变薄(并且会想办法解决这个问题,如果需要的话)
  • SnapshotGet VS TupleCollectionGet在stateQuery
    • 与SnapshotGet的东西往往工作,但并不总是,只有TupleCollectionGet解决了这个问题
    • 任何指针什么是正确的方式做到这一点?

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

回答

0

你不能真正在SeparateTopology使用相同的壶嘴实例调用newStream(),因为这会造成同RandomMessageSpout壶嘴的新实例,这将导致重复的值被发射拆分流通过多个独立的喷口实例将其添加到拓扑中。 (Spout并行化只能在Storm中使用分区喷口进行,其中每个喷口实例处理整个数据集的一个分区 - 例如Kafka分区)。

这里正确的做法是修改CombinedTopology根据需要为每个需要度量流分成多个流(见下文),然后在每一个新分支流做了groupBy()通过该指标的现场和persistentAggregate()

从三叉戟FAQ,

“每个” 返回一个Stream对象,你可以在一个变量存储。然后,您可以在同一个流运行多个eaches拆分它,例如:

Stream s = topology.each(...).groupBy(...).aggregate(...) 
Stream branch1 = s.each(...) 
Stream branch2 = s.each(...) 

有关更多信息,请参见this thread风暴的邮件列表上,并this one

相关问题