在 Linux 环境下使用 HBase 时出现“丢数据”的情况,通常不是 HBase 主动把数据删了,而是架构特性、配置问题或运维操作导致数据看起来丢了 / 实际不可见 / 被覆盖 / 被清理。下面按常见原因 → 原理 → 解决办法说明。
HBase 写流程:
Client → RegionServer → WAL → MemStore →(flush)→ HFile
可能情况:
✅ 排查:
hbase hbck -details
✅ 建议:
hbase.wal.provider 正常HBase 是 append-only + 多版本:
delete 只是打标记MAX_VERSIONS 的旧版本被覆盖常见坑:
# 默认只保留 1 个版本
create 't', {NAME=>'cf', VERSIONS=>1}
✅ 解决:
alter 't', {NAME=>'cf', VERSIONS=>5, TTL=>'FOREVER'}
如果你看到:
“昨晚还有,今早没了”
很可能是 Major Compaction 触发了
✅ 查看:
hbase shell
describe 'your_table'
✅ 控制:
hbase.hregion.majorcompaction = 0 # 禁用自动
Linux 磁盘 100% 时:
✅ 检查:
df -h
du -sh /hbase/*
✅ 建议:
常见误操作:
rm -rf /hbase/data/default/xxx
后果:
✅ 修复:
hbase hbck -fix
⚠️ 严重情况只能从快照恢复
ZK 挂了或数据不一致:
✅ 检查:
zkCli.sh ls /hbase
truncate 't' # 清空表
drop 't' # 删表
⚠️ 这些操作不可逆
错误示例:
table.put(put); // 不检查返回值
✅ 正确:
table.put(list);
或开启:
hbase.client.retries.number=5
# 1. 表是否还在
list
# 2. 元数据是否一致
hbase hbck -details
# 3. RegionServer 是否异常
hbase master ui
# 4. 磁盘
df -h
# 5. WAL 是否损坏
ls /hbase/WALs
你可以补充:
我可以直接帮你定位是哪一类丢数据。