在使用kafka 和zookeeper 實現實時分析程序時,由於zookeeper部署版本和分析程序導入jar包的版本不一致,導致了當實時分析程序從遠程服務器連接kafka集群的zookeeper時報錯,錯誤信息如下:
2012-12-31 10:51:41,562-[TS] INFO main-EventThread org.I0Itec.zkclient.ZkClient - zookeeper state changed (Disconnected) 2012-12-31 10:51:43,008-[TS] INFO main-SendThread(17.22.17.1:2181) org.apache.zookeeper.ClientCnxn - Opening socket connection to server /17.22.17.1:2181. Will not attempt to authenticate using SASL (unknown error) 2012-12-31 10:51:43,009-[TS] INFO main-SendThread(17.22.17.1:2181) org.apache.zookeeper.ClientCnxn - Socket connection established to /17.22.17.1:2181, initiating session 2012-12-31 10:51:43,011-[TS] WARN main-SendThread(17.22.17.1:2181) org.apache.zookeeper.ClientCnxnSocket - Connected to an old server; r-o mode will be unavailable 2012-12-31 10:51:43,011-[TS] INFO main-SendThread(17.22.17.1:2181) org.apache.zookeeper.ClientCnxn - Session establishment complete on server /17.22.17.1:2181, sessionid = 0x13b8a23254100be, negotiated timeout = 6000 2012-12-31 10:51:43,012-[TS] INFO main-EventThread org.I0Itec.zkclient.ZkClient - zookeeper state changed (SyncConnected) 2012-12-31 10:51:47,012-[TS] INFO main-SendThread(17.22.17.1:2181) org.apache.zookeeper.ClientCnxn - Client session timed out, have not heard from server in 4002ms for sessionid 0x13b8a23254100be, closing socket connection and attempting reconnect
還有一個現象就是:實時分析程序不停的拋出上述的錯誤。
從錯誤日志中我們可以發現,zookeeper的客戶端 可以建立和zookeeper server的連接,但是在等待zookeeper server 的返回數據時卻超時了。正是這些日志,把我們引入了歧途,我們一致認為是網絡的某個地方出現了問題(因為機房的網絡架構比較復雜,分析程序和kafka直接存在交換機和防火牆),在試圖解決該問題的過程中,我們始終糾結在這個問題上。
直到我們打算放棄的時候,准備將實時分析程序和kafka部署在同一台服務器上,組內的另外一名同事提醒我檢查下是否是zookeeper版本的問題。我對比了分析程序和kafka zookeeper 的版本,發現兩者的版本的確是不一致的,程序中使用的是 zookeeper.3.4.4,而kafka的zookeeper 是 3.3.4。我在更新了分析程序的zookeeper版本后,運行測試程序,竟然連接成功了,分析程序也運行正常。
好了,到這里,問題終於是解決了,但是我非常想吐槽的是:版本不一致,報錯信息怎么着也應該“人性化”一點吧!