喷嘴失效,螺栓没有故障

时间:2015-09-30 16:41:32

标签: apache-storm

请在下面找到Storm拓扑的统计数据。

Topology Status

相关信息:

  • spout1将所有元组发送到bolt1
  • bolt1执行额外的tick元组(这就是为什么它与spout1发出的元组的no不匹配)

以下是我的问题:

  1. 喷口中有1059个故障,而其中一个下游螺栓只有3个故障
  2. 从spout1发出的元组的数量与bolt1取回的元组的数量不匹配(我检查了代码,每个元组确认或失败,进入bolt1)
  3. 有谁能帮助我理解这里可能出现的问题。我最初的猜测是:

    • topology.max.spout.pending设置为20,000。这可能导致某种缓冲区溢出。 (但如果出现这样的溢出,会不会报告失败?)
    • 是否存在任何可能导致元组无法到达螺栓的网络问题。

4 个答案:

答案 0 :(得分:1)

你的元组确实超时

查看平均完整延迟49秒。这意味着平均每个元组在拓扑内花费48秒没有被任何螺栓处理(如果用螺栓求平均执行时间小于1秒......而49-1 = 48)。

在您的情况下,解决方案是在拓扑中同时更改元组的数量。因此,您应该将topology.max.spout.pending更改为低于5000的值。您应该尝试多个值,但我认为1000可能会有效。

在你问之前,增加元组超时不是解决方法。

关于第一个螺栓上缺少的元组。你确定每个传入的元组会产生另一个元组吗?

你唯一要说的是,你会发现元组失败,你总是为你收到的每个元组产生一个元组吗?

答案 1 :(得分:0)

Spout 1的完整延迟为49秒,即使螺栓的执行延迟小于一秒。这告诉我你在某个地方有积压。如果你的超时时间足够短,你就会有消息超时并且没有回到鲸鱼喷口,然后重新提交它们,使得积压更糟。

答案 2 :(得分:0)

您是否尝试过打开/关闭系统统计信息?这也包括或排除了蜱元组。这样你就可以得到除了蜱元组之外的实际元组数。此外,您可以尝试增加元组的超时,以避免多次发送它们。

答案 3 :(得分:0)

元组失败只有两种方式。要么,方法OutputCollector.fail(...)由Bolt或元组中的用户代码调用超时。为Spout显示的值“Complete Latency”是平均值值。因此,绝对有意义的是,大多数显示为失败的元组都会进入超时状态,因为用户代码只有3个元组失败。

关于发出和确认的元组计数:UI中报告的计数并不总是精确的。即使Storm在内部正确计数,UI也不会显示精确值,因为计数器是逐个收集的。因此,在收集阶段,计数器之间会发生变化,并且UI不会获得计数值的整体一致性快照。

参数topology.max.spout.pending可能是相关的。减少它应该降低元组进入超时的机会。增加超时值本身可能没有帮助(因为你声称它已经“相当高” - 无论这意味着什么)。

但是,如果有网络问题,很难说。如果日志中没有错误消息,则网络应该没问题。