更新时间:2023-03-17 GMT+08:00

文件块过大导致HBase数据导入失败

问题现象

导入数据到hbase报错:NotServingRegionException。

原因分析

当一个block size大于2G时,hdfs在seek的时候会出现读取异常,持续频繁写入regionserver时出现了full gc,且时间比较久,导致hmaster与regionserver之间的心跳异常,然后hmaster把regionserver标记为dead状态,强制重启了Regionserver,重启后触发servercrash机制开始回滚wal日志。现在这个splitwal的文件已经达到将近2.1G,且其仅有一个block块,导致hdfs seek异常,引起splitwal失败,regionserver检测到当前这个wal日志还需要split,又会触发splitwal日志的机制进行回滚,就这样在split与split失败之间不停循环,导致无法上线该regionserver节点上的region,最后出现查询该RS上某一个region时会报region not online的异常。

处理步骤

  1. “HMaster Web UI”右侧,单击“HMaster (主)”进入HBase Web UI界面。
  2. “Procedures”页签查看问题节点。
  3. 以root用户登录问题节并执行hdfs dfs -ls命令查看所有块信息。
  4. 执行hdfs dfs -mkdir命令新建目录用于存放问题块。
  5. 执行hdfs dfs -mv将问题块转移至新建目录位置。

建议与总结

以下两点可供参考:

  • 数据块损坏,通过hdfs fsck /tmp -files -blocks -racks命令检查block数据块健康信息。
  • region正在分裂时对数据的操作会抛NotServingRegionException异常。