面试题答案
一键面试锁机制
- 行锁:HBase在写入时,基于行锁来保证同一行数据修改的原子性与一致性。对于读操作,虽然不会加传统意义上阻止其他读的锁,但为了保证读取到的数据一致性,在读取过程中会结合数据版本等机制确保不会读到未完成写入的数据。
- 无块级锁:HFile的基础Block层面并没有采用传统的块级锁机制,因为块级锁会严重影响并发读性能。HBase通过数据结构设计和读时版本校验等方式避免了块级锁的使用。
缓存策略
- BlockCache:HBase采用了BlockCache来缓存HFile中的Block。读操作时,首先会在BlockCache中查找,如果命中则直接返回数据,大大提高了访问效率。BlockCache采用了LRU(最近最少使用)等淘汰策略,确保缓存中始终保留热点数据。写操作时,数据不会直接写入到BlockCache,以避免脏数据问题,保证了数据一致性。
数据结构与设计
- Immutable:HFile中的Block一旦写入就不可变,这保证了数据一致性。对于更新操作,是通过写入新的HFile来实现的,而不是在原Block上修改,读操作可以根据时间戳等信息来确定读取哪个版本的数据。
- Bloom Filter:HBase利用Bloom Filter来快速判断某个Key是否存在于某个HFile的Block中。如果Bloom Filter判断不存在,则可以直接跳过对该Block的读取,提高了读取效率,同时也间接保证了并发访问时的效率,因为减少了不必要的Block读取竞争。