好的,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 终于看到了 HMasterHRegionServerHQuorumPeer 三者齐全。进入 HBase shell,create 'FK:S02','CF' 成功,scan 也正常返回 0 row(s)。

原因分析

  • HBase 配置为分布式,但 ZooKeeper 集群未正确初始化(缺少 myid、数据目录不一致、网络不通)。

  • 三节点 ZooKeeper 之间无法通信,导致 HBase Master 无法注册,Region 分配失败。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐