在使用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版本后,运行测试程序,竟然连接成功了,分析程序也运行正常。
好了,到这里,问题终于是解决了,但是我非常想吐槽的是:版本不一致,报错信息怎么着也应该“人性化”一点吧!