HBase 说明:
挺通俗易懂的,来自 http://www.dailibu.com/shujuku/2016057157.html
1.HBase切分表
HBase中单表的数据量通常可以达到TB级或PB级,但大多数情况下数据读取可以做到毫秒级。HBase是如何做到的哪?要想实现表中数据的快速访问,通用的做法是数据保持有序并尽可能的将数据保存在内存里。HBase也是这样实现的。
对于海量级的数据,首先要解决存储的问题。
数据存储上,HBase将表切分成小一点的数据单位region,托管到RegionServer上,和以前关系数据库分区表类似。但比关系数据库分区、分库易用。这一点在数据访问上,HBase对用户是透明的。
数据表切分成多个Region,用户在访问数据时,如何找到该条数据对应的region呢?
查找流程如下:
在HBase 0.94以前的版本中,有两个特殊的表,-Root-和.Meta. ,
用来查找各种表的region位置在哪里。
-Root-和.Meta.也像HBase中其他表一样会切分成多个region。
-Root-表比.Meta更特殊一些,永远不会切分超过一个region。
-ROOT-表的region位置信息存放在Zookeeper中,通过Zookeeper可以找到-ROOT-region托管的RegionServer。
通过-ROOT-表就可以找到.META.表region位置。.META表中存放着表切分region的信息。
HBase 0.98以后,-ROOT-表被移除,直接将.Meta表region位置信息存放在Zookeeper中。
Meta表更名为hbase:meta,部分内容如下:
找到数据对应region托管的RegionServer以后,客户端就和RegionServer交互了。Meta表很好的解决了region定位的问题。
1.1 region定位
没有了root表,直接从meta查询,和上面条件一个,假设一个region有128M,一行地址数据1KB,那么就可以定位128M/1kB个region,有2^24的大小,有16T,因为meta表肯定不止一个region,一个region肯定不止128M,所以,从meta来定位的数据大小远大于16T,对于一个Hbase集群来说,完全够了。
而且,少了一层root,网络请求次数肯定会减少,这也是优势之一。
二层架构的定位步骤如下:
(1)用户通过查找zk(zookeeper)的/hbase/meta-region-server节点查询哪台RegionServer上有hbase:meta表。
(2)客户端连接含有hbase:meta表的RegionServer。Hbase:meta表存储了所有Region的行健范围信息,通过这个表就可以查询出你要存取的rowkey属于哪个Region的范围里面,以及这个Region又是属于哪个RegionServer。
(3)获取这些信息后,客户端就可以直连其中一台拥有你要存取的rowkey的RegionServer,并直接对其操作。
(4)客户端会把meta信息缓存起来,下次操作就不需要进行以上加载HBase:meta的步骤了。
————————————————
原文还有之前的三层架构寻找
### 2.BlockCache
RegionServer读取region数据时,必须重新衔接持久化到硬盘上的HFile和内存中MemStore时的数据。
使用BlockCache缓存HFile里读入内存的频繁访问的数据,避免硬盘读。
读取时,首先检查MemStore等修改的队列,然后检查BlockCache看包含该行的Block是否最近被访问过,最后访问硬盘上的对应HFile。
### 3.Block索引
HFile物理存放形式是一个Block的序列外加这些Block的索引。
Block是建立索引的最小数据单位,也是从硬盘读取的最小数据单位。
从HBase里读取一个Block需要先在索引上查找一次该 Block,然后从硬盘读出。
Block的大小可以在列族级别设定,默认值是64KB。
如果业务场景主要是随机查询,可以把Block调小,生成细粒度的Block索引,提高查询性能,代价是Block索引会消耗更多的内存。
如果经常需要使用MR顺序扫描表,一次读取多个Block,大一些Block设置性能更好,同时节省索引内存开销。
### 4.布隆过滤器
存储在硬盘的HFile按Block创建索引,在查询特定的行时,使用Block索引查找应该读取HFile的数据块,效果还是有限的。
Block数据块的默认大小是64KB,这个大小也不调整太多。
如果查询特定的行,只在整个数据块的起始行键上建立索引粒度还是不够。
特定行在Block数据块中的查找方法,HBase还提供了布隆过滤器。
布隆过虑器允许对存储在每个数据块的行键做一个反向测试。
当某行被请求时,先检查布隆过滤器,看看该行是否不在这个数据块中。
HBase提供了行级布隆过滤器和列限定符级布隆过滤器。列限定符级布隆过滤器会增加更多的内存开销。
总结一下,HBase通过切分表、BlockCache,Block索引和布隆过滤器等技术,实现了单表海量数据的毫秒级查询。