Apache storm #Storm:如何为同一数据源设置各种度量

Apache storm #Storm:如何为同一数据源设置各种度量,apache-storm,Apache Storm,我试图设置Storm来聚合一个流,但是在同一个流上有不同的(DRPC可用)度量 例如,流由具有发送者、接收者、消息到达的通道和消息传递的网关的消息组成。我在决定如何组织一个或多个拓扑结构时遇到问题,例如,按网关和/或按通道组织的消息总数。除了总数,每分钟的计数也不错 基本思想是有一个接受消息传递事件的喷口,然后根据需要聚合数据。目前,我正在研究Trident和DRPC,我提出了两种可能的拓扑结构,在现阶段解决了这个问题。无法决定哪种方法更好,如果有的话 整个源代码在此上可用。 它有三类:

我试图设置Storm来聚合一个流,但是在同一个流上有不同的(DRPC可用)度量

例如,流由具有发送者、接收者、消息到达的通道和消息传递的网关的消息组成。我在决定如何组织一个或多个拓扑结构时遇到问题,例如,按网关和/或按通道组织的消息总数。除了总数,每分钟的计数也不错

基本思想是有一个接受消息传递事件的喷口,然后根据需要聚合数据。目前,我正在研究Trident和DRPC,我提出了两种可能的拓扑结构,在现阶段解决了这个问题。无法决定哪种方法更好,如果有的话

整个源代码在此上可用。 它有三类:

    • 用于发出消息传递数据
    • 模拟真实的数据源
    • 为所需的每个度量创建单独的DRPC流
    • 此外,还会为每个度量创建单独的查询状态
    • 它们都使用相同的喷口实例
    • 创建一个包含所有所需指标的DRPC流
    • 为每个度量创建单独的查询状态
    • 每个查询状态提取所需的度量并为其分组结果
现在,关于问题和疑问:

    • 是否有必要使用同一个spout实例,或者每次我都可以说new RandomMessageSpout()
    • 我喜欢这样一种想法,即我不需要按照所有指标来持久化分组数据,而只需要我们以后需要提取的分组
    • 喷口发出的数据是否由所有状态/查询组合实际处理,例如,不是第一个出现的
    • 这以后还会允许在运行时动态添加新的状态/查询组合吗
    • 我真的不喜欢这样一种想法,即我需要将数据按所有指标分组,因为我不需要所有的组合
    • 令人惊讶的是,所有指标都返回相同的数据
      • e、 g.通道和网关查询返回状态度量数据
      • 我发现这始终是按中的第一个字段分组的数据
      • 解释了这种行为背后的原因
      • 但我想知道这是否是一种很好的方法(如果需要的话,我们会找到解决这个问题的方法)
  • stateQuery中的SnapshotGet与TupleCollectionGet
    • 使用SnapshotGet,事情往往会起作用,但并非总是如此,只有TupleCollections才能解决问题
    • 有没有关于正确做法的建议
我想这是一个很长的问题/话题,但我们非常感谢您的帮助! 此外,如果我完全忽略了体系结构,那么关于如何实现这一点的建议将是最受欢迎的。
提前感谢:-)

您不能通过使用相同的spout实例调用
newStream()
SeparateTopology
中实际拆分流,因为这将创建相同
RandomMessageSpout
spout的新实例,这将导致多个重复值被发送到拓扑中,单独的喷口实例。(喷口并行化只有在带有分区喷口的Storm中才可能,其中每个喷口实例处理整个数据集的一个分区——例如,一个Kafka分区)

这里正确的方法是修改
CombinedTopology
,根据需要将流拆分为多个流,以满足您所需的每个度量(见下文),然后根据该度量的字段执行
groupBy()
,并对每个新分支的流执行
persistentAggregate()

从三叉戟常见问题中

“each”返回一个流对象,可以将其存储在变量中。然后,您可以在同一个流上运行多个each来拆分它,例如:

Stream s = topology.each(...).groupBy(...).aggregate(...)
Stream branch1 = s.each(...)
Stream branch2 = s.each(...)
有关更多信息,请参阅Storm邮件列表中的