电信实时数据同步踩坑记(三):HBase 集群启动失败,ZooKeeper 到底听谁的?
好的,Oracle 数据准备好了,GoldenGate 源端也跑起来了。接下来要在 Hadoop 集群上配置目标端——HBase。按照教材,需要启动一个三节点的 HBase 集群,然后创建表 FK:S02。结果 start-hbase.sh 之后,进程出错了,表也建不起来。
现象
在 hadoop1 上执行 start-hbase.sh,然后 jps 一看:
3880 HQuorumPeer
4096 HRegionServer
4639 Jps
没有 HMaster!再检查 hadoop2 和 hadoop3,也只有 HRegionServer 和 HQuorumPeer,同样没有 master。而且 hadoop2 和 hadoop3 上的 RegionServer 进程虽然存在,但日志里疯狂报错。
执行 hbase shell,尝试创建命名空间 FK:
create_namespace 'FK'
看似成功了,但接着 create 'FK:S02','CF' 却报错:
ERROR: Table already exists: FK:S02!
可是 list_namespace_tables 'FK' 又显示空。元数据明显不一致。再试试 scan 'FK:S02':
ERROR: No server address listed in hbase:meta for region ...
HBase 完全不可用。
排查思路
1. 查看 HBase Master 日志
在 hadoop1 上查看 /app/hadoop/hbase-1.2.1/logs/hbase-hadoop-master-hadoop1.log,发现大量:
WARN [main-SendThread(hadoop2:2181)] zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
以及:
ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper create failed after 4 attempts
Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException
很明显,HBase 连接 ZooKeeper 失败了。配置中 hbase.zookeeper.quorum 指向 hadoop1、hadoop2、hadoop3 三个节点,但只有 hadoop1 的 2181 端口可能通,hadoop2 和 hadoop3 根本连不上。
2. 测试 ZooKeeper 端口
在 hadoop1 上测试:
timeout 3 bash -c "echo >/dev/tcp/hadoop1/2181" && echo "OK" || echo "FAIL"
# 输出 OK
timeout 3 bash -c "echo >/dev/tcp/hadoop2/2181" && echo "OK" || echo "FAIL"
# 输出 FAIL
果然,只有本机端口开放。为什么?因为 HBase 内置的 ZooKeeper 虽然启动了(HQuorumPeer 进程在),但 hadoop2 和 hadoop3 上的 ZooKeeper 并没有监听外部接口?还是防火墙问题?
3. 检查防火墙
在 hadoop2 和 hadoop3 上执行 sudo service iptables status,发现防火墙开着。临时关闭:
sudo service iptables stop
再次测试端口,仍然不通。说明不仅仅是防火墙,可能 ZooKeeper 根本没有启动成功。
4. 检查 ZooKeeper 进程状态
在 hadoop2 上 jps 看到 HQuorumPeer,但 zkServer.sh status 却报 Error contacting service。说明 HBase 启动的 ZooKeeper 进程是假的?实际上 HBase 内置 ZooKeeper 是随 HBase 一起启动的,但如果配置有误,可能启动不完整。
查阅 HBase 文档:内置 ZooKeeper 集群需要所有节点能够互相通信,并且每个节点的 dataDir 下要有正确的 myid 文件。检查后发现,hadoop2 和 hadoop3 的 /app/hadoop/zookeeper-3.4.8/data 目录不存在或为空,导致 ZooKeeper 无法形成集群。
5. 简化方案:先用单节点 ZooKeeper
为了快速让 HBase 跑起来,我决定临时将 hbase.zookeeper.quorum 改为 hadoop1,单节点模式。
修改 /app/hadoop/hbase-1.2.1/conf/hbase-site.xml:
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1</value>
</property>
同时确保 hbase.cluster.distributed 仍为 true(保留分布式,但 ZooKeeper 只用一个节点)。
重启 HBase:
stop-hbase.sh
jps | grep -E 'HMaster|HRegionServer|HQuorumPeer' | awk '{print $1}' | xargs kill -9
start-hbase.sh
这次 jps 终于看到了 HMaster、HRegionServer、HQuorumPeer 三者齐全。进入 HBase shell,create 'FK:S02','CF' 成功,scan 也正常返回 0 row(s)。
原因分析
-
HBase 配置为分布式,但 ZooKeeper 集群未正确初始化(缺少 myid、数据目录不一致、网络不通)。
-
三节点 ZooKeeper 之间无法通信,导致 HBase Master 无法注册,Region 分配失败。
更多推荐


所有评论(0)