Hbase 存储结构 数据模型
TABLE
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(Column family),一行由RowKey 时间戳,若干个列组成。除了rowkey和时间戳外,其他的列称为列族,他的命名有一定的规范。
rowKey就像关系数据库的主键,用来检索记录。table中所有的记录按rowkey来排序,访问hbase表的记录有三种方式,分别是
1 通过单个row key访问
2 通过row key的range
3 全表扫描
时间戳:用来区分同一份数据的版本。并且按顺序排序,每次查询都将返回最新版本的数据。
Region
table由region组成,刚开始table就一个region,随着table中的数据增大,到大到一定程度时,hbase会将region切分为两个相等大小的region,region是分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上。相同的region不能拆分。
Store
region是分布式的最小单元,单不是存储的最小单元,每一个region有一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个ColumnFamily建一个store,也说明一个store保存一个ColumnFamily。也说明如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者多个StoreFile组成。
MemStore
memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值时,memStore会被flush到文件,即生成一个快照。目前hbase 会有一个线程来负责memStore的flush操作。
StoreFile
memStore内存中的数据写到文件后就是StoreFile,StoreFile是一HFile的格式保存。
HFile
HFile是HBase的存储格式。是键值对的格式,键值对都是字节数组。HFile除了存储键值对,还需要存储键值对的索引信息,主要包含六个部分。
Data Block 段–保存表中的数据,这部分可以被压缩
Meta Block 段 (可选的)–保存用户自定义的kv对,可以被压缩。
File Info 段–Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。
Data Block Index 段–Data Block的索引。每条索引的key是被索引的block的第一条记录的key。
Meta Block Index段 (可选的)–Meta Block的索引。
Trailer– 这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。
HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO,随之而来的开销当然是需要花费cpu进行压缩和解压缩