HBASE原理
一、原理
1、物理存储
1.hregion
hbase表中的数据按照行键的字典顺序排序,hbase表中的数据按照行的的方向切分为多个region。
最开始只有一个region随着数据量的增加,产生分裂,这个过程不停的进行。一个表可能对应一个或多个region。
region是hbase表分布式存储和负载均衡的基本单元,一个表的多个region可能分布在多台HRegionServer上。
2.Store
region是分布式存储的基本单元,但不是存储的基本单元,其内部还具有结构。一个region由多个Store来组成。
有几个store取决于表的列族的数量,一个列族对应一个store。之所以这么设计,是因为一个列族中的数据往往数据很类似,方便进行压缩,节省存储空间。
3.memStore
表的一个列族对应一个store,store的数量由表中列族的数量来决定。一个store由一个memstore和零个或多个storefile组成。
memStore负责保存内存中的数据。
4.Storefile
storefile其实就是hdfs中的hfile只能写入不能修改,所以hbase写入数据到hdfs的过程其实是不断追加hfile的过程。
hfile的结构:
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进行压缩和解压缩。
目标Hfile的压缩支持两种方式:Gzip,Lzo。
5.HLog(WAL log)
WAL意为Write ahead log(http://en.wikipedia.org/wiki/Write-ahead_logging),类似mysql中的binlog,用来做灾难恢复之用,Hlog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。