面试题答案
一键面试数据写入流程
- 创建WALEdit对象:当客户端向HBase写入数据时,首先会创建一个
WALEdit
对象。这个对象用于封装要写入到预写日志(Write-Ahead Log,WAL)的变更记录。它包含了一系列的操作,比如Put(插入数据)、Delete(删除数据)等。 - 添加操作记录:对于每一个数据变更操作(如Put操作),相关的细节会被添加到
WALEdit
对象中。例如,Put操作会包含行键、列族、列限定符、时间戳以及对应的值等信息。这些信息以特定的数据结构组织在WALEdit
对象内部。 - 写入WAL:
WALEdit
对象创建并填充好操作记录后,会被传递给HLog
(HBase的预写日志实现)进行写入。HLog
负责将WALEdit
中的内容持久化到磁盘上的日志文件中。这个过程通过HLog
的append
方法完成,append
方法会将WALEdit
序列化为字节数组,并追加到当前活跃的日志文件末尾。在写入过程中,会涉及到文件同步等操作,以确保数据的持久性。
恢复操作流程
- 日志回放:在HBase发生故障(如RegionServer崩溃)后,需要进行数据恢复。恢复过程从读取WAL日志文件开始。
WALEdit
对象会在日志回放阶段被重新解析。HLog
的读取机制会从日志文件中读取序列化的WALEdit
记录,并将其反序列化为WALEdit
对象。 - 重放操作:一旦
WALEdit
对象被成功反序列化,其中包含的操作(如Put、Delete)会被按照顺序重新应用到对应的Region上。对于Put操作,会将数据重新插入到Region的MemStore(内存存储结构)中;对于Delete操作,会从MemStore中标记相应的数据为删除状态。这样可以保证即使在故障发生时部分数据尚未持久化到磁盘,通过回放WAL中的WALEdit
记录,也能恢复到故障前尽可能完整的状态。 - 一致性检查与修复:在重放
WALEdit
中的操作后,可能还需要进行一致性检查。例如,检查MemStore中的数据与HBase的元数据(如HRegionInfo
等)是否一致。如果发现不一致的情况,可能需要进一步的修复操作,以确保数据的完整性和一致性。这可能涉及到对MemStore中的数据进行调整,或者与其他相关组件(如HMaster
)进行协调。