常见问题

最近更新时间: 2026-03-13 09:03:00

客户端访问hbase报错Connection reset by peer

Connection reset by peer是服务端主动关闭了连接。这种情况一般有以下几个原因:

  1. 客户端传递的认证有问题,服务端未校验通过认证信息关闭的连接,建议检查下认证信息是否设置正确。
  2. 客户端hbase-site.xml配置文件未正确加载。 kerberos认证过程中需要的配置项比较多,这些配置项一般在集群的$HBASE_HOME/conf/hbase-site.xml中定义,可以尝试让应用加载到该配置文件。如果是spark应用,可以把hbase-site.xml拷贝到所有节点$SPARK_HOME/conf目录下面。

HMaster/RegionServer挂掉,频繁重启

  • 可能原因
    HMaster/RegionServer 分配堆内存太小,导致OOM。
  • 处理方式
    调大hbase-env.sh中的Heapsize HMHeapsize

如何更改hbase表名

原生没有这个命令,可以通过快照方式绕行,这个过程中只有文件软链的生成,不会发生真实文件拷贝。

  1. 停止表继续插入
 hbase shell>disable 'tableName'
  1. 制作快照
hbase shell> snapshot 'tableName', 'tableSnapshot'
  1. 克隆快照为新的名字
hbase shell> clone_snapshot 'tableSnapshot', 'newTableName'
  1. 删除快照
hbase shell> delete_snapshot 'tableSnapshot'
  1. 删除原来表
hbase shell> drop 'tableName'

list后即可查看到newTableName表

hbase表未上线

大量表无法上线通用处理方法

  1. 停掉HBase服务
  2. 然后移走MasterData目录 (这里不会涉及数据丢失)
hdfs dfs -mv /hbase/MasterData /hbase/MasterData2
  1. 启动HBase服务
  2. 执行hbase hbck > hbck.txt执行健康检查命令,检查表是否都正常上线。

meta 表无法上线

  • 现象
    执行hbck报错,Master is initializing, 查看active master日志,有打印hbase:meta is NOT online
  • 处理方式
    上线hbase:meta
hbase hbck -j $HBASE_HOME/hbase-hbck2/hbase-hbck2-1.2.0.jar assigns -o 1588230740

namespace表未上线

  • 现象
    执行hbck报错,Master is initializing, 查看active master日志,有打印hbase:namespace xxx is NOT online
  • 处理方式
    上线hbase:namespace
hbase hbck -j $HBASE_HOME/hbase-hbck2/hbase-hbck2-1.2.0.jar assigns -o ${namespace的region id}

普通表region未上线如何处理

  • 现象
    执行hbck后,打印输出中有一些ERROR报错信息:region not deployed on any region server
  • 处理方式
    单个region:
hbase hbck -j /usr/local/service/hbase/hbase-hbck2/hbase-hbck2-*.jar assigns -o ${namespace的region id}

如果有问题region数量较多,批量处理方式:

hbase hbck > hbck.txt  
###下面命令有个jar包路径,可能需要根据实际路径替换
cat hbck.txt | grep Region | awk -F '\\.,' '{print $1}' | awk -F '\\.' '{print "hbase hbck -j /usr/local/service/hbase/hbase-hbck2/hbase-hbck2-*.jar assigns -o "$NF}' | grep -v ERROR > script.sh
###执行下script.sh之前检查一下再执行
chmod +x script.sh
sh script.sh

assign命令执行后仍无法上线region

  • 现象
    assign命令后仍然无法上线region, hbck输出还是not deployed
    查看hbase UI上,对应的region处于RIT CLOSING状态。
    查看Procedure & Locks页面,看到对应region有其他procedure,导致assign没有获取到锁,因此没有成功上线。
  • 处理方式
    需要执行以下命令将procedure lock释放,再重新执行assign命令。
hbase hbck -j $HBASE_HOME/hbase-hbck2/hbase-hbck2-1.2.0.jar bypass -or pid

访问开启kerberos认证的hbase报错GSS initiate failed

可能原因:
hbase.master.kerberos.principalhbase.regionserver.kerberos.principal配置时候不能直接配置主机名字,需要用_HOST代替,这里的principal是客户端和服务端协商使用。HMaster会主备切换,主机名不固定。

hbase支持的最大连接数是多少?

hbase不同于HiveServer,没有session的概念,所以没有固定的长连接。Hbase有并行处理线程数设置,由hbase.regionserver.handler.count(默认值64)参数控制,意味着每个RegionServer可以同时处理64个客户端请求,多余的请求会暂时被积压到callqueue队列中等待,没有直接的限制连接数量的参数,客户端连接一直增多可能会触发进程的句柄数量限制。

建议测试Regionserver每秒处理请求数比较有参考意义,测试方式:

  1. 设置参数,处理get请求的handler数量为3000.5(1-0.2)=120个
hbase.regionserver.handler.count=300,
hbase.ipc.server.callqueue.read.ratio=0.5
hbase.ipc.server.callqueue.scan.ratio=0.2
hbase.ipc.server.callqueue.handler.factor=0.1
hbase.ipc.server.max.callqueue.length=1000
  1. 停掉集群至只有1台regionserver
  2. 并发get查询某测试表的1条数据,查看该regionserver的Requests Per Second值。

Regionserver宕机后,重启后(运行一段时间后)自动退出

File does not exist

  • 现象
    存在某个(parent)Region java.io.FileNotFoundException: File does not exist 异常:
  • 解决建议
    执行hbase hbck检查,看看是否存在 Found lingering reference file错误,有则执行hbase hbck -fixReferenceFiles修复;

存在Full GC耗时很长

  • 现象
    分析regionserver的GC日志(与RegionServer日志同一目录,默认在/data/emr/hbase/logs),存在Full GC耗时很长时(可能导致读写变慢),如图:

  • 解决建议
    修改RegionServer内存, hbase-env.shHeapsize的大小。

启动报某个协处理器coprocessor类找不到时,RegionServer会退出

  1. 分析看看是否是业务自行添加的
  2. 修改或添加hbase-site参数跳过coprocessor异常: hbase.coprocessor.abortonerror=false
  3. 启动RegionServer

存在wal.FSHLog: Slow sync cost告警,发现写WALs慢,可以配置MultiWAL特性增加并行度

  1. 修改hbase-site中配置 hbase.wal.provider=multiwal
  2. 重启RegionServer服务

kerberos hbase客户端调用需要的最小配置集合是什么

需要以下配置项,具体值可以在HMaster节点的$HBASE_HOME/conf/hbase-site.xml中获取。

"hbase.zookeeper.quorum": "xx1.com,xx2.com,xx3.com",
"zookeeper.znode.parent": "/hbase-secure",
"hadoop.security.authentication":"kerberos",
"hbase.security.authentication" :"kerberos",
"hbase.master.kerberos.principal": "xx",
"hbase.regionserver.kerberos.principal": "xx",
选加:
hbase.client.keytab.principal
hbase.client.keytab.file

hbase shell 如何手动覆盖某个配置

可以通过传递或覆盖hbase-*.xml中指定的hbase配置。 在命令行上以-D为前缀的键/值,如下所示:

hbase shell -Dhbase.xxx=xxxx -Dhbase.xxx2=xxxx2

进入shell之后获取配置

@shell.hbase.configuration.get("hbase.zookeeper.quorum")

如何清空HBase 集群的数据

如果新部署未投产的集群发生了故障,这种时候可以通过清空数据来快速解决掉故障。

  1. 停掉HBase服务
  2. 删除 /hbase hdfs dfs -mv /hbase /tmp
  3. zkcli进入zk客户端之后,删除znodedeleteall /hbase-{id}
  4. 启动HBase集群
    其他:
    如果开启了kerberos的集群,连接zk时需要认证。
    ${KEYTAB_PATH} 是服务器keytab的存储路径
    ${PRINCIPAL} 是使用klist列出的principal
klist -kt ${KEYTAB_PAH}
kinit -kt ${KEYTAB_PAH} ${PRINCIPAL}

连接zk服务端:

${ZOOKEEPER_HOME}/bin/zkCli.sh -server ${zk ip}:2181

snapshot报错Protocol message was too large

  • 现象
    报错:Protocol message was too large. May be malicious. Use CodedInputStream.setSizeLimit() to increase the size limit.
  • 可能原因
    表数据量很大,HFile很多导致生成的快照信息过大,在校验snapshot信息的时候超过了Protobuf默认的大小64MB。
  • 解决方案
  1. 建议在业务空闲时间段,通过major_compact命令分批合并表的region,文件数量减少后该问题就可以解决。
  2. 直接报错可以通过在hbase-site中增加参数snapshot.manifest.size.limit=268435456(256MB), 然后重启HMaster解决
  3. 然后可能会遇到snapshot超时的报错,需要增加参数,然后重启HMaster解决hbase.snapshot.master.timeout.millis=1800000(30分钟)

如何查看major compaction进度

如果有个超大的region,做了major_compact ${region id}之后不知道进展。
解决方案:
可以在hbase master ui上面看到对应的表的compaction状态是Major。

  1. 然后在后台可以看到对应region的.tmp目录大小一直在增长,compaction合并之后的HFile放在这里了,可以根据增长速度估计进度。
  2. RegionServer有个接口可以获取要处理多少KV,已经处理了多少KV,写程序获取。