【问题标题】:Messages dropping between spout and bolt消息在 spout 和 bolt 之间掉线
【发布时间】:2018-11-07 01:19:20
【问题描述】:

我已经实现了一个从 Kafka 队列读取消息的苍鹭拓扑。因此,我的拓扑有一个 kafka spout 和一个bolt,用于计算从队列中读取的消息数。

当我将 10000 消息发送到 kafka 队列中时,我可以看到在 heron 拓扑中的 kafka spout 中接收到的所有消息,但是在螺栓处丢失的消息很少。

以下是heron的拓扑设置

 Config config = Config.newBuilder()
                    .setUserConfig("topology.max.spout.pending", 100000)

                    .setUserConfig("topology.message.timeout.secs", 100000)
                    .setNumContainers(1)
                    .setPerContainerCpu(3)
                    .setPerContainerRamInGigabytes(4)
                    .setDeliverySemantics("ATLEAST_ONCE")
                    .build();

任何指针都会有所帮助。

编辑:我正在使用苍鹭的流 API。我用log 螺栓替换了计数螺栓,但在log 螺栓的日志中看到同样的消息丢失问题

processingGraphBuilder.newSource(kafkaSource)
                      .log();

编辑 2:我通过完全删除 streamlet API 解决了这个问题。我使用基本的 spout 和 bolt API 重新实现了所有内容,并对 spout 进行了确认。这解决了这个问题。我猜这是因为 streamlet API 中的 spout 没有发生确认

【问题讨论】:

    标签: apache-kafka apache-storm heron


    【解决方案1】:

    简单的答案:不应该放弃。

    几个问题: - 在heronui中,你的spout的所有时间发出和确认计数是多少? - 在heronui中,你的bolt的所有时间执行、确认和失败计数是多少?

    【讨论】:

    • 我将 1M 条消息从生产者写入 kafka 队列,我看到所有消息都被 heron 拓扑中的 kafka spout 读取。我通过检查苍鹭日志确定消息是由 kafka spout 接收的。但是在heron-ui 中,我只看到 567188 发射计数和 0 作为 ack 计数。
    • 我看到所有 1M 消息都记录在 spout 的苍鹭日志中。但是,我看到执行计数的苍鹭螺栓中遗漏了几条消息。
    • 抱歉,我误读了heron-ui 中的日志。确认计数与螺栓的发射计数相同。然而,spout 的 ack 计数为 0,其中发出计数与消息数相同
    • 如果 kafka 有 1M 条消息并且每条消息都转换为一个元组,则 spout 发出计数应该正好是 1M。否则,喷口可能需要进行一些调查。 bolt 执行计数应该和 spout 发射计数一样,所以它也应该是 1M。这些数字应该有助于您定位问题。另一方面,如果您的拓扑处于 atleast_once 模式,则确认计数应与发出计数相同。如果拓扑以 atmost_once 模式运行,则应为 0。
    【解决方案2】:

    当您说消息被丢弃时,您是否看到失败计数指标中记录了失败,或者只是您在 bolt 中的执行计数与 spout 的发出计数不相符?

    在 Storm 兼容模式下,指标是根据样本计算的(我认为默认为 5%)。因此,计数可能会超出该范围。例如,根据流的采样时间,您可以发送 100 个元组,执行计数可以是 80 或 120。

    【讨论】:

    • 我看到拓扑中的执行计数螺栓下降。我错过了一些配置吗?看到 spout 和 bolt 不匹配是否正常?
    • 我觉得配置没问题。
    • spout的emit count要满足bolt的execute count。这些指标在 Heron UI 中可用。你可以做一个快速检查。另外,您能否阐明“消息丢失”的详细症状?
    • @Neng,我检查了 heron-ui,我只看到 567188 作为发射计数和 0 作为 ack 计数。这些消息只是从 kafka 队列中读取的一些温度读数。
    • @Neng,就消息丢失的症状而言,我看到最后几条消息被丢弃了。但是,这些消息被记录在 spout 日志中。例如,如果我向 kafka 发送 1M 消息,kafka spout 会收到 1M,但 Bolt 会收到前 996839 条消息,但不会收到后面的消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2015-04-22
    • 2011-02-24
    • 2016-04-17
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多