Java storm-查找延迟源

Java storm-查找延迟源,java,cassandra,apache-storm,Java,Cassandra,Apache Storm,我有一个由三部分组成的拓扑结构,它有一些严重的延迟问题,但我很难确定在哪里 卡夫卡->数据库查找->写入卡桑德拉 storm UI中的数字如下所示: (我看到螺栓以大于1.0的容量运行) 如果两个螺栓的过程延迟约为65毫秒,为什么“完整延迟”大于400秒?“失败”元组来自超时,我怀疑延迟值正在稳步增加 元组通过洗牌组合连接 Cassandra住在AWS上,所以在途中可能会有网络限制 风暴群有3台机器。拓扑中有3个工作线程。FWIW-拓扑的默认值似乎是无限的。我添加了对stormConfig.p

我有一个由三部分组成的拓扑结构,它有一些严重的延迟问题,但我很难确定在哪里

卡夫卡->数据库查找->写入卡桑德拉

storm UI中的数字如下所示:

(我看到螺栓以大于1.0的容量运行)

如果两个螺栓的过程延迟约为65毫秒,为什么“完整延迟”大于400秒?“失败”元组来自超时,我怀疑延迟值正在稳步增加

元组通过洗牌组合连接

Cassandra住在AWS上,所以在途中可能会有网络限制


风暴群有3台机器。拓扑中有3个工作线程。

FWIW-拓扑的默认值似乎是无限的。我添加了对
stormConfig.put(Config.TOPOLOGY\u MAX\u SPOUT\u PENDING,500)的调用并且(到目前为止)问题似乎已经得到缓解。可能的“雷鸣群”问题


将拓扑\u MAX\u喷动\u PENDING设置为500后:

您的拓扑结构有几个问题:

  • 查看解码字节1的容量,并将其保存到卡桑德拉喷口。两者都大于1(所有喷口容量之和应小于1),这意味着您使用的资源多于可用资源。也就是说,拓扑无法处理负载
  • 如果元组的吞吐量在一天中发生变化,那么拓扑\u MAX\u SPOUT\u PENDING将解决您的问题。这是说,如果你有偷窥时间,你会在偷窥时间以外的时间赶上
  • 您需要增加工人机器的数量或优化瓶颈喷口中的代码(或者两者兼而有之)。否则,您将无法处理所有元组
  • 您可能可以通过批量插入而不是逐个读取插入元组来改进cassandra persister
  • 我郑重建议您始终将拓扑“MAX\u SPOUT\u PENDING”设置为保守值最大喷口挂起,表示拓扑内未确认元组的最大数量,请记住此值乘以点的数量,如果元组在发出后30秒未被确认,则元组将超时(失败)
  • 是的,你的问题是元组超时,这就是正在发生的事情
  • (编辑)如果您正在运行dev环境(或在部署拓扑之后),您可能会遇到由尚未被spout使用的消息生成的流量峰值;防止这种情况对拓扑产生负面影响非常重要--您永远不知道何时需要重新启动生产拓扑或执行一些维护--,如果是这种情况,您可以将其作为流量中的一个临时峰值来处理——喷口需要消耗拓扑离线时生成的所有消息——并且在一段时间(或许多分钟)后,传入元组的频率稳定下来;您可以使用max pout pending参数处理此问题(再次阅读第2项)
  • 考虑到集群中有3个节点,cpu使用率为0,1,您可以向集群中添加更多的执行器

  • 1.监控系统上的CPU负载小于0.1-基本上处于空闲状态。2.这是决定性因素。将其设置为500产生了所有的不同(见我答案中的图片)。见#14。事实证明,卡桑德拉并不关心批量插入5。看#2@ethrbunny我查看了手册,实际上容量表示螺栓上花费的时间,而不是cpu使用量。关于cassandra,您仍然有一个延迟源,批量插入可能会使您的persistor变快,什么是快速插入1000*1记录*30毫秒还是10*100记录*100毫秒?您必须考虑软件包在网络中传输和被确认所需的时间。@ethrbunny该拓扑的总延迟值非常大,因为下一个元组仅在插入前一个元组后插入到casandra,这将导致总ack延迟非常大。