kafka 报错:kafka server:Message was too large ,server rejected it to avoid allocation
kafka報錯信息:
kafka server:Message was too large ,server rejected it to avoid allocation?
kafka版本:
kafka_2.11-1.0.0
?
原因分析:
查看kafka配置,默認單條消息最大為1M,當單條消息長度超過1M時,就會出現發送到broker
失敗,從而導致消息在producer的隊列中一直累積,直到撐爆生產者的內存。
?
于是趕緊修改kafka配置,解決問題。主要修改步驟如下:
1.修改kafka的broker配置:message.max.bytes(默認:1000000B),這個參數表示單條
消息的最大長度。在使用kafka的時候,應該預估單條消息的最大長度,不然導致發送失敗。
2.修改kafka的broker配置:replica.fetch.max.bytes (默認: 1MB),broker可復制的
消息的最大字節數。這個值應該比message.max.bytes大,否則broker會接收此消息,但無
法將此消息復制出去,從而造成數據丟失。
3.修改消費者程序端配置:fetch.message.max.bytes (默認 1MB) – 消費者能讀取的最大
消息。這個值應該大于或等于message.max.bytes。如果不調節這個參數,就會導致消費者無
法消費到消息,并且不會爆出異常或者警告,導致消息在broker中累積,此處要注意。
需要考慮的問題:
?1.從性能上考慮:通過性能測試,kafka在消息為10K時吞吐量達到最大,更大的消息會降低
吞吐量,在設計集群的容量時,尤其要考慮這點。
2.可用的內存和分區數:Brokers會為每個分區分配replica.fetch.max.bytes參數指定的
內存空間,假設replica.fetch.max.bytes=1M,且有1000個分區,則需要差不多1G的內存,
確保 分區數*最大的消息不會超過服務器的內存,否則會報OOM錯誤。同樣地,消費端
的fetch.message.max.bytes指定了最大消息需要的內存空間,同樣,分區數*最大需要內存
空間不能超過服務器的內存。所以,如果你有大的消息要傳送,則在內存一定的情況下,只
能使用較少的分區數或者使用更大內存的服務器。
3.垃圾回收:更大的消息會讓GC的時間更長(因為broker需要分配更大的塊),隨時關注GC的
日志和服務器的日志信息。如果長時間的GC導致kafka丟失了zookeeper的會話,則需要配
置zookeeper.session.timeout.ms參數為更大的超時時間。
?
?
解決辦法:
?
在kafka的文件server.properties中添加如下三個個配置項,均設置為標準的10M:
?
#broker能接收消息的最大字節數
message.max.bytes=10485760? ? (10M)
#broker可復制的消息的最大字節數
replica.fetch.max.bytes=10485760?? (10M)
#消費者端的可讀取的最大消息
fetch.message.max.bytes=10485760? ? (10M)
?
或者在啟動的時候加入到參數后面:
bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my-topic --config max.message.bytes=128000
?
總結
以上是生活随笔為你收集整理的kafka 报错:kafka server:Message was too large ,server rejected it to avoid allocation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kafka消费端慢慢延迟(网络带宽不足)
- 下一篇: kafka时间戳