温馨提示×

ubuntu下hbase故障如何排查

小樊
33
2025-12-14 18:07:43
栏目: 智能运维

Ubuntu 下 HBase 故障排查手册

一 快速定位流程

  • 先看进程与端口:在 MasterRegionServer 节点执行 jps,确认是否存在 HMaster/HRegionServer;必要时用 netstat -tulpen | grep -E ‘16000|16010|2181|8080|60010’ 检查监听端口。
  • 立刻查看日志:到 $HBASE_HOME/logs/ 打开最新的 hbase--master-.loghbase--regionserver-.log,从 ERROR/Exception/FATAL 行向上追溯首个异常栈。
  • 校验依赖连通性:
    • HDFS:执行 hdfs dfsadmin -safemode get(返回 Safe mode is OFF 才正常),必要时 hdfs dfsadmin -safemode leave;用 hdfs dfs -ls / 验证 NameNode 可读写。
    • ZooKeeper:用 echo stat | nc <zk_host> 2181zkCli.sh ls / 检查会话与 /hbase 节点。
  • 基础环境自检:确认 Java 可用(java -version)、HBASE_HOME/PATH 正确(echo $HBASE_HOME、$PATH)、系统时间同步(建议 NTP,误差不超过 30 秒)。
  • 配置语法与兼容性:检查 hbase-site.xml 是否可解析(常见为标签未闭合)、Hadoop 与 HBase 版本兼容、以及 HBase 与 Hadoop 的日志框架 SLF4J 冲突

二 常见故障与修复要点

  • 命令未找到 hbase:未设置环境变量或安装不完整。在 ~/.bashrc 加入
    export HBASE_HOME=/usr/local/hbase
    export PATH=$PATH:$HBASE_HOME/bin
    执行 source ~/.bashrc 后用 hbase version 验证。
  • 启动报错 SLF4J multiple bindings:Hadoop 与 HBase 的日志绑定冲突。保留其一,例如移除 Hadoopslf4j-reload4j-*.jarHBaselog4j-slf4j-impl-*.jar,再重启。
  • hbase shell 报 ServerNotRunningYetException:
    1)HDFS 处于安全模式则 hdfs dfsadmin -safemode leave
    2)检查 Hadoop 与 HBase 版本/依赖冲突;
    3)分布式场景在 hbase-site.xml 明确:
    hbase.cluster.distributedtrue
    hbase.rootdirhdfs://:9000/hbase
    hbase.wal.providerfilesystem
    4)按“先停 HBase、再停 Hadoop”的顺序重启。
  • 配置解析错误:如 hbase-site.xml 标签未闭合或属性缺失,修正后重启。
  • HMaster 无法成为 Active:多为 HDFS 地址/端口不一致。若 core-site.xmlfs.defaultFS=hdfs://:9000,则 hbase.rootdir 必须显式写端口(例如 hdfs://:9000/hbase),避免默认 8020 误连。
  • ZooKeeper 连接失败或 /hbase 节点异常:检查 HBASE_MANAGES_ZK、集群时间同步、/etc/hosts 一致;必要时清理 ZK 的 /hbase 根节点后重启(风险操作,先备份)。
  • 启动报 hbase:namespace 已存在:ZK 残留元数据导致。先停 HBase,清理 /hbase(ZK),再启动;或使用 OfflineMetaRepair 修复元数据后启动。
  • 无法优雅关闭:默认 PID 文件在 /tmp 易被清理。在 conf/hbase-env.sh 设置 HBASE_PID_DIR 到持久目录(如 /usr/local/hbase/pids)。

三 配置与端口速查

检查项 推荐值或路径 说明
hbase.rootdir hdfs://:9000/hbase core-site.xmlfs.defaultFS 端口保持一致
hbase.cluster.distributed true 分布式模式必须显式开启
hbase.zookeeper.quorum zk1,zk2,zk3localhost 与 ZK 部署一致
hbase.wal.provider filesystem 兼容性更好的 WAL 提供者
HBASE_MANAGES_ZK true/false 使用内置或外部 ZK
HBASE_PID_DIR /usr/local/hbase/pids 避免 /tmp 清理导致无法 stop
Web UI 16010(Master),旧版常见 60010 访问 http://:16010 查看集群状态与 RegionServer 列表

四 性能与稳定性问题

  • OOM 与 GC:按负载设置 HBASE_MASTER_OPTS/HBASE_REGIONSERVER_OPTS(如 -Xms/-Xmx),大堆建议 G1 GC;结合 JMX/Prometheus+Grafana 持续观测。
  • RegionTooBusyException:写入过快触发 MemStore 上限。可减小批次、适度提高 hbase.hregion.memstore.flush.sizehbase.hregion.memstore.block.multiplier、缩短 hbase.hstore.blockingwaits;大数据导入优先考虑 bulkload;优化 RowKey 避免热点(加盐/哈希/反转/时间戳反转)。

五 一键排查脚本示例

#!/usr/bin/env bash
set -e

echo "=== 1) Java & 环境变量 ==="
java -version || { echo "Java 未安装"; exit 1; }
echo "HBASE_HOME=$HBASE_HOME"
echo "PATH=$PATH"
which hbase || echo "hbase 命令未找到,请检查 HBASE_HOME/bin 是否在 PATH"

echo "=== 2) 进程与端口 ==="
jps
for p in 16000 16010 2181 8080 60010; do
  ss -ltnp | grep -q ":$p " || echo "端口 $p 未监听"
done

echo "=== 3) HDFS 状态 ==="
hdfs dfsadmin -safemode get || true
hdfs dfs -ls / || true

echo "=== 4) ZooKeeper 状态 ==="
{ echo stat; sleep 1; } | nc localhost 2181 || echo "无法连接 ZK 2181"

echo "=== 5) 最近错误日志 ==="
LOGFILE=$(ls -1t $HBASE_HOME/logs/hbase-*-master-*.log 2>/dev/null | head -1)
[ -f "$LOGFILE" ] && tail -n 100 "$LOGFILE" | grep -i -A5 -B5 "ERROR\|Exception\|FATAL" || echo "未找到 Master 日志"

echo "=== 6) 配置语法检查 ==="
xmllint --noout $HBASE_HOME/conf/hbase-site.xml 2>/dev/null || echo "hbase-site.xml 可能格式错误"

echo "=== 7) 时间同步 ==="
timedatectl status || ntpq -p || echo "请检查 NTP 时间同步(建议误差 < 30s)"

将脚本保存为 check_hbase.sh,在 MasterRegionServer 上执行,可快速收集关键故障线索。

0