基本概念
- HFile文件
保存在磁盘的hbase表数据文件, 格式为HFile。数据块为存储单元, 默认认大小64KB。 - MemStore
写缓存,由于HFile中的数据要求是有序的,数据是先在MemStore中,排好序后,再刷写到HFile. 每次刷写都会形成一个新的HFile。 - WAL
数据会先写WAL(Write-Ahead logfile)日志文件文件中,然后再写入MemStore中。以便在MemStore(内存)中的数据丢失后可以恢复.
每间隔hbase.regionserver.optionallogflushinterval(默认1s), HBase会把操作从内存写入WAL. 一个RegionServer上的所有Region共享一个WAL实例。
WAL的检查间隔由hbase.regionserver.logroll.period定义,默认值为1小时。检查的内容是把当前WAL中的操作跟实际持久化到HDFS上的操作比较,看哪些操作已经被持久化了,被持久化的操作就会被移动到.oldlogs文件夹内(这个文件夹也是在HDFS上的)。
一个WAL实例包含有多个WAL文件。WAL文件的最大数量通过hbase.regionserver.maxlogs(默认是32)参数来定义。 - BlockCache
读缓存,每次查询出的数据会缓存在BlockCache中,方便下次查询.
写流程
写流程
- Client先访问zookeeper,获取hbase:meta表所在的Region Server, 查询hbase:meta表获取目标Redgion Server. 在将该表的region信息以及meta表的位置信息缓存在客户端的meta cache之后与目标Region Sever进行通讯;
- 将数据顺序写入(追加)到WAL;
- 将数据写入对应的MemStore,数据会在MemStore进行排序;
- 向客户端发送ack, 等达到MemStore的刷写时机后,将数据刷写到HFile。
读流程
- Client先访问zookeeper,获取hbase:meta表所在的Region Server, 查询hbase:meta表获取目标Redgion Server. 在将该表的region信息以及meta表的位置信息缓存在客户端的meta cache之后与目标Region Sever进行通讯;
- 分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据块进行合并, 之后缓存到Block Cache中。
此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
- 将合并后的最终结果返回给客户端。