【问题标题】:Apache Storm bolt possibly timing outApache Storm bolt 可能超时
【发布时间】:2016-11-14 16:51:12
【问题描述】:

我对 Storm 比较陌生,我正在尝试创建一个拓扑,该拓扑将接收一个文件,解析内容,然后运行第三方 API 对该内容进行一些分析。

我有一个拓扑、一个喷口和三个螺栓。基本上,spout 将文件提供给将提取文件内容的第一个 bolt。然后第二个 bolt 运行第三方解析,最后一个 bolt 将所有内容写入 xml 字符串表示。

我已经测试了前两个螺栓按预期工作,但是当我添加最后一个螺栓时问题出现了。似乎第二个螺栓需要很长时间才能运行,并且 Storm 正在超时。第三方代码的执行时间大约需要 37 秒。我一直在读到,Storm 会在 30 秒后使 spout 超时并使其失败。

我一直在日志中看到这个:

  17580 [Thread-9-disruptor-executor[3 3]-send-queue] INFO  backtype.storm.util - Async loop interrupted!

我尝试使用以下方法在拓扑类中设置我的 TOPOLOGY_MESSAGE_TIMEOUT_SEC 配置:

conf.setMessageTimeoutSecs(300);   

但这似乎不起作用。关于如何增加 spout 的超时时间以便有足够的时间来完成执行的任何想法?

【问题讨论】:

  • 所以我设法让它有点工作,但我是通过增加 Thread.sleep(90000);我不知道为什么会这样,也不知道将其设置为多少合适的时间。
  • 有没有办法在日志中找到超时消息。即使我面临同样的问题,也无法找到此类消息。

标签: java hadoop apache-storm


【解决方案1】:

那个时间(300 秒)意味着一旦一个元组被一个 spout 发出,拓扑有 300 秒的时间来处理这个元组以及所有后续的元组,这些元组会因为那个元组而在拓扑中波动(通过三个螺栓) .

如果 spout 发出第二个元组,但第一个 Bolt 仍在处理第一个元组,则时钟仍在为第二个元组计时。

这意味着您必须:

1) 增加 bolts 的并行提示,这样就不会出现积压减慢 spout 发出的任何元组的处理速度,或者

2) 使用 topology.max.spout.pending 属性来限制 spout 在必须等待其中一个元组完成之前可以发出的元组数量。

【讨论】:

  • 所以如果我选择选项 2,你会建议设置 toplogy.max.spout.pending = 1 吗?
  • 每条线是通过拓扑一直处理还是有一些聚合?任何螺栓都可以并行运行多个实例吗?
  • 没有聚合,是的,多个实例可以并行运行。我在本地运行这一切,我怀疑这是我的问题发生的地方。正如上面评论中提到的,如果我在拓扑类中将 Thread.sleep(10000) 增加到 Thread.sleep(40000),它会起作用。我只是不确定这实际上在做什么。
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多