Hbase 表操作
Master:负责启动的时候分配Region到具体的RegionServer,执行各种管理操作。
RegionServer:有一个或多个Region。
Region:表的一部分数据。HBase是一个会自动分片的数据库
一个WAL:预写日志,是一个环状滚动日志,当操作到达Region时,Hbase先将操作写到WAL中。HBase先把数据放到基于内存实现的Memstore中,等数据到达一定数量时才刷到HFile中。如果期间服务器宕机或者断电,数据丢失,WAL就是一个保险机制。当故障恢复时候,就可以从WAL中恢复数据。
# 开启异步写入WAL
Mutation.setDurability(Durability.ASYNC_WAL);
Region在满足hbase.regionserver.optionallogflushinterval
条件才会写入,默认时间间隔是1s。
检查间隔由hbase.regionserver.logroll.period
定义,默认为1小时。
WAL文件的最大数量通过hbase.regionserver.maxlogs
定义,默认为32。
- 当WAL文件所在的块快要满了
- WAL所占的空间大于或等于某个阈值
hbase.regionserver.hlog.blocksize * hbase.regionserver.logroll.multiplier
WAL被创建出来之后会放在/hbase/.log
下,归档之后放在/hbase/.oldlogs
下。
Master会定时清理.oldlogs
,
- TTL进程:保证WAL文件一直存活,达到
hbase.master.logcleaner.ttl
定义的超时时间为止(默认十分钟) - 备份机制(replaction):如果开启了HBase的备份机制,那么HBase要保证备份集群已经完全不需要这个WAL文件了,才会删除。
Store内部结构
- MemStore:每个Store中有一个MemStore实例。数据写入WAL之后就会被放入MemStore。MemStore是内存的存储对象,只有当MemStore满了才会将数据写入到HFile中。
- HFile:在Store中有多个HFile。当MemStore满了之后HBase就会生成一个新的HFile,然后把MemStore中的内容写入到这个HFile中,HFile直接跟HDFS打交道,是数据的存储实体。
HDFS上的数据只能创建,追加和删除,对于一个数据库来说,按顺序存放数据是非常重要的,是性能的保障,所以不能按照数据到来的顺序写入硬盘。
使用内存先把数据整理成顺序存放,然后再一起写入硬盘。
MemStore
HBase使用了LSM树结构存储数据。数据现在MemStore中整理成LSM树,在刷写到HFile中。读取的时候有个专门的缓存叫BlockCache
,如果开启BlockCache,先读取BlockCache,读取不到才读HFile+MemStore。如果数据添加后又删除了,则刷写的时候就直接不把这个数据写入到HDFS中。
HFile
在HBase中一个块默认大小为64KB,在列族上的BLOCKSIZE属性定义。
- Data:数据块,每个HFile存在多个Data块,
- Meta:元数据块,可选的,只有在文件关闭时才会写入,存储了HFile文件的元数据信息。
- FileInfo:文件信息,必要存储信息,只有在文件关闭的时候写入,存储的是该文件的信息。
- DataIndex:存储Data块索引信息的块文件。也就是Data块的偏移值,
- MetaIndex:Meta块索引信息的块文件。
- Trailer:必须,存储了FileInfo,DataIndex,MetaIndex块的偏移值。
Data块
第一位存储的是块的类型,后面存储的是多个KeyValue键值对,也就是单元格(Cell)的实现类,Cell是一个接口,KeyValue是它的实现类。
BlockType(块类型):Data、Meta、FILE_INFO、ROOT_INDEX...
一个KeyValue类里面最后一个部分是存储数据的Value,而前面的部分是存储该跟单元格相关的元数据信息。如果你存储的value很小,那么该单元格绝大部分空间都是rowkey、column family、column等元数据。
Region的定位
- 客户端通过ZK的
/hbase/meta-region-server
节点查询到哪台RegionServer上有hbase:meta
表。 - 客户啊短连接含有
hbase:meta
表的RegionServer,hbase:meta表存储了所有Region的行键范围信息,通过这个表就可以查询出需要存取的rowkey属于哪个Region的范围里面,以及这个Region又属于RegionServer。 - 客户端直连一台拥有要存取rowkey的RegionServer,并对其直接操作。
- 客户端把
hbase:meta
的信息直接缓存起来。
一个Region包含多个Store:一个Store对应一个列族的数据,如果一个表有两个列族,那么在一个Region中就有两个Store,每个Store内部有MemStore和HFile两部分。