面试题答案
一键面试基本原理
HBase HFile中的索引相关Block实时更新基于日志结构合并树(LSM树)的思想。当有新数据写入时,不会直接修改磁盘上的HFile,而是先写入内存中的MemStore。当MemStore达到一定阈值时,会进行Flush操作,将数据持久化到磁盘生成新的HFile。在此过程中,索引信息也随之更新。
关键组件
- MemStore:内存中的存储结构,用于临时存储写入的数据。当数据写入HBase时,首先会被写入到MemStore中。
- HFile:存储在磁盘上的文件,是HBase数据的最终持久化形式。HFile由多个数据块(Data Block)、索引块(Index Block)和元数据块(Meta Block)等组成。
- HLog(WAL,Write - Ahead Log):预写式日志,用于记录所有对HBase数据的修改操作。其目的是在系统故障时能够恢复数据,保证数据的一致性和持久性。
交互过程
- 写入阶段:
- 客户端发起写入请求,数据首先被写入到对应的Region的MemStore中。同时,该写入操作会被记录到HLog中。
- MemStore按照KeyValue对的顺序进行排序存储,这为后续生成有序的HFile奠定基础。
- Flush阶段:
- 当MemStore的大小达到配置的阈值(如
hbase.hregion.memstore.flush.size
)时,会触发Flush操作。 - MemStore中的数据会按照KeyValue的排序顺序被写入到磁盘,生成一个新的HFile。在这个过程中,会同时生成索引信息(如RowIndex、BloomFilter等)并写入到HFile的索引块中。索引的生成有助于快速定位数据在HFile中的位置。
- 当MemStore的大小达到配置的阈值(如
- 合并阶段:
- 随着不断的写入和Flush操作,磁盘上会产生多个小的HFile。为了提高查询效率和节省空间,HBase会定期进行Compaction操作,将多个HFile合并成一个大的HFile。
- 在合并过程中,会重新生成索引信息,综合考虑多个小HFile的索引数据,生成新的、更优化的索引块,更新到合并后的HFile中。这样,索引相关Block随着数据的持久化和合并操作实现了实时更新。