Python KeyError:kafka.producer.record\u acculator.RecordBatch

Python KeyError:kafka.producer.record\u acculator.RecordBatch,python,asynchronous,apache-kafka,send,keyerror,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 c

使用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)
键错误:
批处理已关闭--忽略Batch.done()
处理errback时出错
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python2.6/site packages/kafka/future.py”,第79行,在“回调”中
f(价值)
文件“/usr/lib/python2.6/site packages/kafka/producer/sender.py”,第185行,在“生产失败”中
self.\u完成\u批次(批次,错误,-1,无)
文件“/usr/lib/python2.6/site packages/kafka/producer/sender.py”,第243行,整批
自释放(批量)
文件“/usr/lib/python2.6/site packages/kafka/producer/record_acculator.py”,第507行,在deallocate中
自身不完整。移除(批次)
文件“/usr/lib/python2.6/site packages/kafka/producer/record_acculator.py”,删除中第587行
返回自我。\u不完整。删除(批次)
在我的主题中,每次运行都会收到不同数量的消息。问题似乎是kafka producer.send调用在程序结束之前无法完成发送

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

send()方法是异步的。调用时,它会将记录添加到 挂起记录的缓冲区发送并立即返回。这允许 为了提高效率,制作人需要将单个记录批处理在一起

对此,有许多简单的解决方案(例如将
batch.size
设置为较低的数值)可能会导致性能瓶颈


您如何解决此问题而不过度影响性能?

退出前只需调用
producer.flush()

退出前只需调用
producer.flush()

这是我尝试的第一件事。如描述中所述,生产者似乎已经发送了异步调用来发送消息,但它们尚未完成,可能是因为批大小不够小。@r2d2oid您的问题非常简单。你自己解释的-节目在制作人发送所有消息之前退出。试图用批量大小来解决这个问题是不正确的。若缓冲区中有内容,则必须等待发送完成。将阻止你的程序,直到所有东西都被发送,就这样。如果在发送最后一条记录后调用
producer.flush()
后遇到此错误,那么我错了,只是不理解您的问题(kafka python中的错误?)。这是我尝试的第一件事。如描述中所述,生产者似乎已经发送了异步调用来发送消息,但它们尚未完成,可能是因为批大小不够小。@r2d2oid您的问题非常简单。你自己解释的-节目在制作人发送所有消息之前退出。试图用批量大小来解决这个问题是不正确的。若缓冲区中有内容,则必须等待发送完成。将阻止你的程序,直到所有东西都被发送,就这样。如果您在发送最后一条记录后调用
producer.flush()
后遇到此错误,那么我错了,只是不理解您的问题(kafka python中的错误?)。