我们有这个 HBase 集群:30+ 个节点,48 个表,40+TB 在 HDFS 级别,复制因子 2。由于两个节点上的磁盘故障,我们在 HDFS 上有一个损坏的文件。
当前 HDFS 状态
输出摘录hdfs fsck /
,显示损坏的 HBase 区域文件:
/user/hbase/table_foo_bar/295cff9c67379c1204a6ddd15808af0b/n/ae0fdf7d0fa24ad1914ca934d3493e56:
CORRUPT blockpool BP-323062689-192.168.12.45-1357244568924 block blk_9209554458788732793
/user/hbase/table_foo_bar/295cff9c67379c1204a6ddd15808af0b/n/ae0fdf7d0fa24ad1914ca934d3493e56:
MISSING 1 blocks of total size 134217728 B
CORRUPT FILES: 1
MISSING BLOCKS: 1
MISSING SIZE: 134217728 B
CORRUPT BLOCKS: 1
The filesystem under path '/' is CORRUPT
丢失的数据不可恢复(磁盘已损坏)。
当前 HBase 状态
另一方面,根据 HBase 的说法,一切都很好,花花公子
hbase hbck
说:
Version: 0.94.6-cdh4.4.0
...
table_foo_bar is okay.
Number of regions: 1425
Deployed on: ....
...
0 inconsistencies detected.
Status: OK
此外,似乎我们仍然可以从损坏区域文件的未丢失块中查询数据(据我认为我能够根据该区域的开始和结束行键进行检查)。
下一步
- 由于文件块数据不可恢复,似乎唯一的选择是删除完整的损坏文件(使用
hadoop fs -rm
或hadoop fsck -delete /
)。这将在 HDFS 级别“修复”损坏。 - 但是,我担心删除 HDFS 文件会在 HBase 级别引入损坏,因为完整的区域文件将消失
- 我考虑
hadoop fsck -move /
将损坏的文件移动到/lost+found
并查看 HBase 将如何处理,但移动到/lost+found
并不像看起来那样可逆,所以我也对此犹豫不决
具体问题:
我应该删除文件吗?(丢失与该区域对应的数据对我们来说是合理的。)当您手动删除 HDFS 中的 HBase 区域文件时会发生什么坏事?它只是删除数据还是会在 HBase 中引入丑陋的元数据损坏,也必须加以处理?
或者我们真的可以让情况保持原样,目前似乎有效(HBase 没有抱怨/看到腐败)?