KeyError:kafka.producer.record_accumulator.RecordBatch

时间:2017-10-10 17:44:47

标签: python asynchronous apache-kafka send keyerror

使用kafka-python api向主题发送一堆消息。一部分消息成功发送到主题,但并非所有消息都在程序终止之前发送,并显示以下错误消息:

KeyError: <kafka.producer.record_accumulator.RecordBatch object at 0x143d290>
Batch is already closed -- ignoring batch.done()
Error processing errback
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/kafka/future.py", line 79, in _call_backs
    f(value)
  File "/usr/lib/python2.6/site-packages/kafka/producer/sender.py", line 185, in _failed_produce
    self._complete_batch(batch, error, -1, None)
  File "/usr/lib/python2.6/site-packages/kafka/producer/sender.py", line 243, in _complete_batch
    self._accumulator.deallocate(batch)
  File "/usr/lib/python2.6/site-packages/kafka/producer/record_accumulator.py", line 507, in deallocate
    self._incomplete.remove(batch)
  File "/usr/lib/python2.6/site-packages/kafka/producer/record_accumulator.py", line 587, in remove
    return self._incomplete.remove(batch)

每次运行都会在我的主题中实际收到不同数量的消息。问题似乎是kafka producer.send调用在程序到达之前没有完成发送。

根据kafka文档,producer.send是一个异步方法,可能是根本原因 - 并非所有异步线程在进程被终止之前完成发送:

  

send()方法是异步的。调用时,它会将记录添加到a   待处理记录的缓冲区发送并立即返回。这允许   生产者将个别记录分组在一起以提高效率。

有许多天真的解决方案(例如将batch.size设置为较低的数字)可能会导致性能瓶颈。

您如何解决此问题而不会过多地影响性能

1 个答案:

答案 0 :(得分:3)

请在退出前致电producer.flush()