【问题标题】:Kafka producer batch.size doesn't take effectKafka生产者batch.size不生效
【发布时间】:2018-02-14 09:27:41
【问题描述】:

我使用的是 Kafka 1.0,我增加了 batch.size=100K 以优化我的生产者性能。但是我发现无论我设置 batch.size=100K 或 1000K 还是 1K 都没有任何效果。另外,我设置了我的 linger.ms=5,但它使性能更差。 当我调试Kafka生产者的源代码如下:

if (result.batchIsFull || result.newBatchCreated) {
     this.sender.wakeup();
}

我发现 result.newBatchCreated 的值始终为 true,我猜这就是为什么 batch.size 没有生效的原因,因为它每次都不会在 batchIsFull=true 时唤醒发送者。

我现在很困惑,请问有什么想法吗?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    这是一个可能的副本:Improving performance of Kafka Producer

    但简而言之,batch.sizelinger.ms 参数应该一起调整,因为需要权衡:

    在您的示例中,如果当前批次已满,生产者会将当前批次发送到服务器(此值以 bytes 为单位,因此 100 字节的 IMO 很少)或 延迟超时发生。

    因此,如果您必须尝试和调整这些参数以找到最佳设置。

    【讨论】:

    • 嗨,batch.size 是 100000,我刚刚修改了问题。当我设置 linger.ms = 10 时,无论我设置什么 batch.size,它总是一样慢。
    • 是的,因为您的批次只填满了 10 毫秒。您需要设置它,以便您的批次有时间填满。积累 100 万条记录需要多长时间。
    • 谢谢,我现在知道了,因为我使用的是同步 API,而不是异步。
    • 没有同步生产者。要阻止生产,您需要在从异步 API 返回的 Future 上调用 get(),如“producer.send(record).get()”。无论哪种方式,这都不应该改变底层的 kafka 协议获取请求,这通常意味着“批处理”并且由 linger.ms 控制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2019-10-31
    相关资源
    最近更新 更多