多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 读写过程 ## 读请求过程: 1. 客户端通过zookeeper以及root表和meta表找到目标数据所在的regionserver 2. 联系regionserver查询目标数据 3. regionserver定位到目标数据所在的region,发出查询请求 4. **region先在memstore中查找,命中则返回** 5. 如果在memstore中找不到,去查找blockcache,则在storefile中扫描(布隆过滤器)(**可能会扫描到很多的storefile----bloomfilter**) **布隆过滤器参数类型有2种:Row, Column+Row** 行键 和 行键+列 一个完整行的数据可能存放在多个HFile里. 为了读出完整行,HBase可能需要读取包含该行信息的所有HFile ## 写请求过程: 1. client向region server提交写请求 2. region server找到目标region 3. region检查数据是否与schema(表描述信息)一致 4. 如果客户端没有指定版本,则获取当前系统时间作为数据版本 5. 将更新写入WAL log 6. 将更新写入Memstore 7. 判断Memstore的是否需要flush为Store文件。 # 细节描述 hbase使用MemStore和StoreFile存储对表的更新。 数据在更新时首先写入Log(WAL log)和内存(MemStore)中, MemStore中的数据是排序的, 当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。 于此同时,系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了。 当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。 **StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(minor_compact, major_compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行split,等分为两个StoreFile** 由于对表的更新是不断追加的,compact时,需要访问Store中全部的 StoreFile和MemStore,将他们按row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,合并的过程还是比较快