【问题标题】:Kafka fetch max bytes doesn't work as expectedKafka fetch max bytes 无法按预期工作
【发布时间】:2020-05-28 23:59:09
【问题描述】:

我有一个价值 1 GB 消息的主题。 A. Kafka 消费者决定消费这些消息。我能做些什么来禁止消费者一次消费所有消息?我试图设置

代理上的fetch.max.bytes

到 30 MB 以在每次轮询中只允许 30 MB 的消息。代理似乎不尊重这一点,并试图一次将所有消息提供给消费者,从而导致消费者内存不足错误。我该如何解决这个问题?

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    Kafka 配置可能会让人不知所措。通常在 Kafka 中,多个配置可以协同工作以达到一个结果。这带来了灵活性,但灵活性是有代价的。

    来自fetch.max.bytes的文档:

    记录是消费者分批抓取的,如果抓取的第一个非空分区的第一个记录批大于这个值,仍然会返回记录批,以保证消费者可以取得进展。

    只有在消费者端,有更多的配置需要考虑来限制消费者的内存使用,包括:

    • max.poll.records:限制在一次轮询调用中检索到的记录数。默认值为 500。
    • max.partition.fetch.bytes:限制每个分区获取的字节数。这应该不是问题,因为默认值为 1MB。

    根据KIP-81中的信息,实际使用的内存应该是min(num brokers * max.fetch.bytes, max.partition.fetch.bytes * num_partitions)

    另外,在同一个 KIP 中:

    消费者(Fetcher)延迟解压,直到记录返回给用户,但由于 max.poll.records 的原因,它可能最终会保留来自单个分区的解压数据进行几次迭代。

    我建议您也调整这些参数,希望这会让您进入所需的状态。

    【讨论】:

    • 感谢您的建议。我尝试了“max.partition.fetch.bytes”,效果很好,但是,它会丢弃低于该数字的消息。我在 Kafka 上的最大消息大小为 5 MB。当我将 max.partition.fetch.bytes 设置为 5 MB 时,我什么也得不到。不确定是 Kafka 代理内存问题还是我需要调整
    • 是的,这是一个限制。 max.partition.fetch.bytes 必须始终大于 max.message.bytes(代理配置)。否则,消费者可能无法消费所有消息。
    • 当我有一个由 3 个代理组成的集群并且我设置了 max.partition.fetch.bytes 时会发生什么。 ?我看到奇怪的反应。有时会读取来自 2 个代理的分区,而有时只读取 1 个代理。它不提供来自所有 3 个代理的所有分区。因此,当我从代理返回的数据少于预期时,延迟就会增加。
    • 如答案中所述,代理数可能会影响内存使用,但根据观察到的确切行为,它也可能与分区数或会话超时配置有关。由于这是一个特定问题的后续问题,我强烈建议您将其作为一个单独的新问题发布,并确保指定可用的堆内存、代理数量、主题、分区、消费者实例和会话超时,以及任何日志和观察到的错误或行为。
    • 在 node-kafka 中使用 max.fetch.bytes 似乎是限制 kafka 的唯一方法导致我逃避错误,如下所述:github.com/SOHU-Co/kafka-node/issues/1208。我的最大获取字节数为 50k,每条消息大约 2k。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2020-09-22
    • 2013-11-27
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多