Apache Drill分布式模式连接ZooKeeper失败问题排查求助
从你描述的情况来看,Drillbit虽然显示运行,但没有成功在ZooKeeper中注册节点,这直接导致了drill-conf报错和日志里的空指针异常。咱们一步步来定位问题:
1. 确认ZooKeeper的myid文件配置是否正确
你的ZooKeeper配置里指定了server.1=sagar-pc:2888:3888,这意味着在ZK的dataDir(也就是/opt/zookeeper-3.4.11/data)目录下必须存在一个名为myid的文件,文件内容只能是1。很多人会忽略这个细节,虽然ZK能启动,但集群模式下节点无法正常识别自己的身份,间接影响Drill的注册。
你可以执行以下命令检查:
cat /opt/zookeeper-3.4.11/data/myid
如果文件不存在,就创建它:
echo 1 > /opt/zookeeper-3.4.11/data/myid
2. 修正Drill的网络绑定配置
默认情况下,Drillbit可能会绑定到localhost,导致它在ZK中注册的是本地回环地址,而drill-conf无法识别这个地址。你需要在/opt/drill/conf/drill-override.conf中明确指定绑定地址:
drill.exec: { cluster-id: "drillbits1", zk.connect: "sagar-pc:2181", bind.address: "sagar-pc", # 或者直接填你的wlan0网卡inet地址 http.port: 8047, rpc.port: 31010 }
3. 验证主机名解析的正确性
确保sagar-pc能正确解析到你的wlan0网卡地址,而不是127.0.0.1。你可以执行:
ping sagar-pc
如果返回的是127.0.0.1,需要修改/etc/hosts文件,把sagar-pc的指向改成你的实际网卡IP。
4. 清理旧数据并重启服务
之前的错误可能留下了无效的ZK节点数据,建议按以下顺序重启服务:
- 停止Drillbit:
/opt/drill/bin/drillbit.sh stop - 停止ZooKeeper:
/opt/zookeeper-3.4.11/bin/zkServer.sh stop - 删除ZK数据目录下的旧数据:
rm -rf /opt/zookeeper-3.4.11/data/version-2 - 启动ZooKeeper:
/opt/zookeeper-3.4.11/bin/zkServer.sh start - 启动Drillbit:
/opt/drill/bin/drillbit.sh start
5. 检查ZK中的Drill节点状态
重启后,连接到ZK客户端查看/drill/drillbits1的子节点:
/opt/zookeeper-3.4.11/bin/zkCli.sh -server sagar-pc:2181
在ZK客户端中执行:
ls /drill/drillbits1
如果看到有子节点(类似drillbit-xxx-xxx-xxx),说明Drillbit已经成功注册,此时再运行/opt/drill/bin/drill-conf应该就能正常工作了。
如果还是有问题,建议查看Drill的详细日志文件/opt/drill/log/drillbit.log,里面会有更详细的连接ZK或注册节点的错误信息,方便进一步排查。
内容的提问来源于stack exchange,提问作者rusk

