描述
今天Java程序和kafka整合的時候遇到一個情況,Java可以和kafka連接但是在發送數據的時候出現了以下的異常:
-2019-07-30 14:55:08.494 -ERROR 2191 [kafka-producer-network-thread | producer-1] (LoggingProducerListener.java:84) Exception thrown when sending a message with key='null' and payload='[{"index_level":"1","unit":"%","id...' to topic testData:
-
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for testData-0: 30032 ms has passed since batch creation plus linger time
看到連接超時一開始以爲是連接的問題,但是連接是正常的,在尋找資料後,找到了一個解決這個問題的方法。
解決
啓動zookeeper的客戶工具,刪除zookeeper根目錄下的brokers目錄下的topic目錄下的所有東西(這樣會把之前建的所有topic都刪除)
具體步驟:
- 啓動zookeeper 客戶端:進到zookeeper的安裝目錄
[root@Node1 bin]# cd /usr/apps/zookeeper/bin/
[root@Node1 bin]# ls
README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh zookeeper.out
[root@Node1 bin]# ./zkCli.sh
Connecting to localhost:2181
- 查看/brokers/topic下面有什麼東西
[zk: localhost:2181(CONNECTED) 0] ls /brokers/topics
- 刪除裏面所有的文件
[zk: localhost:2181(CONNECTED) 0]rmr /brokers/topics/hive-test-table
- 重新啓動producer和consumer,Java重新發送就可以看發過來的數據
原因分析
具體原因不清楚。
但是這個超時是因爲producer.properties配置文件有一個值是request.timeout.ms,默認是30秒。producer往broker發送數據時是串行的,只有上次batch全部寫入broker,並且全部callback函數執行完畢後,纔會繼續下一次發送。如果上一次發送全部callback函數執行時間超過了30秒,就會導致後續batch的message發送時間大於創建時間30秒以上,然後被producer丟棄並拋出異常。