HBase按列族存储
HBase的数据模型
应用程序使用一个或多个Table存储数据;每个Table包含至少一个预定义的Column Family;每个Column Family可以包含任意数量的Column;对于特定Column,任何Row都可以在Column中使用一个Cell存储一个值;Cell中的值是多版本的。
HBase的原子操作
提供行范围的原子更新,只更新单行的操作是原子操作,更新多行的操作不是原子操作。
集群中各结点的责任
分布式文件系统,通常是HDFS:存储HBase的数据,包括Write Ahead Log、Table数据。
Master:读取所有Region的基本信息,将未被管理(没有分配到RegionServer或已分配到RegionServer但RegionServer当前不可用)的Region分配到可用的RegionServer。
HBase中的每个Table被自动分割为若干Region,每个Region包含了对应Table某个Key区间内的Row,是HBase在集群中对数据进行划分和分布式管理的最小单元;HBase使用-ROOT-表和.META.存储各个Region的基本信息,-ROOT-拥有唯一Region,其中存储了.META.表各个Region的基本信息,.META.表可以拥有多个Region,其中存储了属于其他所有用户表的各个Region的基本信息。
RegionServer:管理由Master分配过来的Region,接受并处理客户端对所管理Region中Row的访问请求。
ZooKeeper:记录属于-ROOT-的唯一Region被分配到的RegionServer;为Master了解当前可用的RegionServer提供场所(RegionServer周期性报告,Master周期性查询)。
客户端访问HBase的一般流程
1)访问ZooKeeper,获取属于-ROOT-的唯一Region被分配到的RegionServer(主机名或IP);
2)访问RegionServer,获取属于.META.的各个Region的基本信息,通过这些基本信息可以确定将要访问的Row所在的Region以及该Region被分配到的RegionServer(主机名或IP);
3)访问RegionServer,请求针对Row的各种操作。
HBase数据的物理存储:使用LSM Tree
B+ Tree:中间结点只存储Key和结点指针,叶结点存储Key和记录指针;叶结点按序双向链接;使用根结点指针查找,使用第一个叶结点指针遍列;插入、删除造成结点分割和合并。
LSM Tree:使用更新日志和缓存,更新日志保证更新操作可重做,缓存避免频繁访问磁盘;缓存满则被刷新到磁盘,并与磁盘上的数据合并,合并后的磁盘B树依磁盘的顺序访问特性最优存储。
HBase Table在文件系统中的目录结构
/<hbase-root-dir>/<tablename>/<encoded-regionname>/<column-family>/<filename>
按Column Family存储,每个Column Family可以使用多个文件存储数据。每个Region根据预设的Threshold自动分片:最初,一个大Region在所在RegionServer上被分成两个小Region;最终,Master可能依据负载均衡策略将两个小Region分配到其他RegionServer;大Region被分成两个小Region后并不立即被删除,而只是被标记为Offline,直到后台程序将大Region的数据完全拷贝到两个小Region后,大Region才被彻底删除。