Apache storm 风暴,螺栓延迟和总延迟之间的巨大差异?

Apache storm 风暴,螺栓延迟和总延迟之间的巨大差异?,apache-storm,Apache Storm,下面是我的拓扑的Storm UI的屏幕截图。这是在拓扑完成处理10k消息后执行的 (拓扑配置为4个辅助对象,并使用KafkaSpout) 我的螺栓的“进程延迟”之和大约为8100ms,拓扑的完整延迟要长得多115881ms 我知道,由于资源争用或与Storm内部相关的事情,可能会出现此类差异。我相信资源争夺在这里不是问题;在这个测试期间,GC根本没有运行,分析表明我有大量可用的CPU资源 所以我认为问题在于我在某种程度上滥用了Storm的内部结构。有什么建议吗 元组一定在某处等待,可能在喷口中;

下面是我的拓扑的Storm UI的屏幕截图。这是在拓扑完成处理10k消息后执行的

(拓扑配置为4个辅助对象,并使用KafkaSpout)

我的螺栓的“进程延迟”之和大约为8100ms,拓扑的完整延迟要长得多115881ms

我知道,由于资源争用或与Storm内部相关的事情,可能会出现此类差异。我相信资源争夺在这里不是问题;在这个测试期间,GC根本没有运行,分析表明我有大量可用的CPU资源

所以我认为问题在于我在某种程度上滥用了Storm的内部结构。有什么建议吗

元组一定在某处等待,可能在喷口中;是等待发送到拓扑,还是在处理消息时等待确认

可能我应该调整ACKER的数量(我已经将ACKER设置为4,与工人的数量相同)

关于如何解决此问题的其他一般建议

*请注意,进程延迟和执行延迟之间存在较大差异的一个螺栓实现了滴答螺栓、批处理模式。因此,这种差异是意料之中的

*编辑。 我怀疑这种差异可能涉及到消息在完全处理后被喷口确认。如果我在处理Storm UI时刷新它,则与喷口的确认编号相比,我的最终螺栓的确认编号会快速增加。尽管这可能是由于喷口应答的消息比最后一个螺栓少得多;最后一个螺栓确认的几百条消息可能代表喷口中的一条消息。但是,我想我应该提到这一怀疑,以获得意见,如果有可能的话,喷口的装袋任务是满溢的


可能有多种原因。首先,你需要了解数字是如何测量的

  • Spout Complete Latency:在调用
    Spout.ack()
    之前发出元组的时间
  • 螺栓执行延迟:运行
    Bolt.execute()
    所需的时间
  • 螺栓处理延迟:调用时间
    Bolt.execute()
    ,直到螺栓确认给定的输入元组
  • 如果在
    Bolt.execute
    中没有立即确认每个传入的输入元组(这是绝对正确的),则处理延迟可能比执行延迟高得多

    此外,由于元组可以保留在内部输入/输出缓冲区中,因此处理延迟不能等于完整延迟。这会增加额外的时间,直到最后一次确认完成,从而增加完整的延迟。此外,acker需要处理所有传入的ack,并将完全处理的元组通知Spout。这也增加了完整的延迟


    问题的根源可能是操作员之间的大型内部缓冲区。这可以通过增加dop(并行度)或通过设置参数
    TOPOLOGY\u MAX\u spoot\u PEDING
    来解决——这限制了拓扑中的元组数量。因此,如果有太多的元组在飞行中,喷口会停止发射元组,直到接收到ACK为止。因此,元组不会在内部缓冲区中排队,并且完全延迟会降低。如果这没有帮助,您可能需要增加acker的数量。如果ACK处理速度不够快,ACK可能会缓冲起来,从而增加整个延迟。

    可能有多种原因。首先,你需要了解数字是如何测量的

  • Spout Complete Latency:在调用
    Spout.ack()
    之前发出元组的时间
  • 螺栓执行延迟:运行
    Bolt.execute()
    所需的时间
  • 螺栓处理延迟:调用时间
    Bolt.execute()
    ,直到螺栓确认给定的输入元组
  • 如果在
    Bolt.execute
    中没有立即确认每个传入的输入元组(这是绝对正确的),则处理延迟可能比执行延迟高得多

    此外,由于元组可以保留在内部输入/输出缓冲区中,因此处理延迟不能等于完整延迟。这会增加额外的时间,直到最后一次确认完成,从而增加完整的延迟。此外,acker需要处理所有传入的ack,并将完全处理的元组通知Spout。这也增加了完整的延迟


    问题的根源可能是操作员之间的大型内部缓冲区。这可以通过增加dop(并行度)或通过设置参数
    TOPOLOGY\u MAX\u spoot\u PEDING
    来解决——这限制了拓扑中的元组数量。因此,如果有太多的元组在飞行中,喷口会停止发射元组,直到接收到ACK为止。因此,元组不会在内部缓冲区中排队,并且完全延迟会降低。如果这没有帮助,您可能需要增加acker的数量。如果ACK处理速度不够快,ACK可能会缓冲起来,从而增加整个延迟。

    再次感谢您的详细回复。我很清楚这些信息,只是几个问题。你提到增加“dop”,这是什么?对如何查看内部缓冲区内容有何建议?关于如何深入了解ack时代是否存在延迟的任何建议?dop=并行度。没有直接的方法访问内部缓冲区。您可以监视生产者的“已发射/已转移”计数,并与消费者的“已执行”计数进行比较。如果差异很大,元组必须位于某些内部缓冲区中(但不清楚它是生产者输出缓冲区还是消费者输入缓冲区——不知道您将从谁那里获得此信息)。您还可以在UI中启用“系统统计信息”,以获取有关acker的更多信息。但我想没有“黄金之路”来完成这件事。我会去威斯康星州