面试题答案
一键面试Store的组成部分及其作用
- MemStore
- 作用:
- 内存中的存储结构,用于临时存储客户端写入的数据。当客户端向HBase写入数据时,数据首先会被写入到MemStore中。
- 采用LSM(Log - Structured Merge - Tree)结构,以KeyValue对的形式存储数据,方便快速的写入操作。
- 当MemStore达到一定的阈值(通常是配置的
hbase.hregion.memstore.flush.size
大小,默认128MB)时,会触发Flush操作,将数据持久化到磁盘形成HFile。
- 作用:
- StoreFile(HFile)
- 作用:
- 存储在HDFS上的文件,是MemStore Flush后的数据持久化形式。HFile采用KeyValue对的有序存储,并且按照一定的块(block)进行组织,默认块大小为64KB。
- 支持数据的高效读取,利用Bloom Filter可以快速判断数据是否在某个HFile中,避免不必要的磁盘I/O。同时,通过索引结构(如元数据块索引、数据块索引等)可以快速定位到具体的KeyValue对所在的位置。
- 相关结构:
- 数据块:存储实际的KeyValue数据,在读取数据时可以批量读取,提高I/O效率。
- 索引块:记录数据块的索引信息,通过索引可以快速定位到包含目标数据的数据块。
- 元数据块:存储一些关于HFile的元数据信息,如Bloom Filter等。
- 作用:
- WAL(Write - Ahead Log)
- 作用:
- 预写式日志,用于保证数据的可靠性。在数据写入MemStore之前,会先将数据写入WAL。
- 当RegionServer发生故障时,可以通过重放WAL日志来恢复未持久化到HFile的数据,确保数据不会丢失。
- WAL采用顺序写入的方式,性能较高。每个RegionServer维护一个WAL文件,不同Region的写入操作都会记录到这个WAL文件中。
- 作用:
Store在数据读写过程中的角色
- 写入过程
- 客户端发起写请求,数据首先被写入到WAL中,以保证数据的可靠性。
- 接着,数据被写入到MemStore中,此时数据处于内存中,等待被Flush到磁盘。
- 随着写入数据的增多,当MemStore达到配置的阈值时,会触发Flush操作,将MemStore中的数据按照KeyValue对的顺序写入到HDFS上的新HFile中,同时WAL中对应的日志可以被删除(因为数据已经持久化)。
- 读取过程
- 客户端发起读请求,Store首先会在MemStore中查找数据,如果能找到则直接返回。因为MemStore在内存中,查找速度很快。
- 如果在MemStore中未找到,会在StoreFile(HFile)中查找。HFile通过索引结构和Bloom Filter快速定位和判断数据是否存在于当前HFile中。如果存在,则从HFile中读取数据返回给客户端。
- 在读取过程中,可能会涉及到多个HFile的查找,因为一个Store可能包含多个HFile(多次Flush操作会生成多个HFile),Store会按照一定的顺序(如时间顺序等)依次查找这些HFile,直到找到目标数据或者确认数据不存在。