1、行健设计
(1)、存储方式:磁盘上一个列族下所有的单元格都存储在一个存储文件(store file)中,不同列族的单元格不会出现在同一个存储文件中。
(2)、NULL 不会存储在HBase表中。
(3)、每个单元格在实际存储时也保存了行健和列键,即单独存储了它在表中所处位置的相关信息。
(4)、同一个单元格的多个版本被单独存储为连续的单元格,单元格按照时间戳降序排列。故在HFile读取时候,最新的值先被读到。
(5)、单元格的KeyValue内容:行健、列族、列限定符、时间戳、值。KeyValue存储先按照行健排序,再按列键排序。
(6)、对于KeyValue,筛选的效率从左到右变差:行健、列族、列限定符、时间戳、值。故而尽量将重要的筛选信息左移。
2、部分键扫描
(1)、扫描的范围包括起始键,不包括终止键。
(2)、行键的长度要固定。
3、 时间序列
(1)、salting:将行键加一个prefix。
优点:确保数据分散到所有的region server中去。
缺点:当用户要扫描一个连续范围,需要请求每个region server。多线程并行读取数据。
(2)、字段交换、提升权重:调整时间戳位置。
(3)、随机化:若数据只需要随机读取,不需要连续扫描。
4、可以将专门创建一个列族,作为索引。
5、辅助索引.
(1)、客户端管理索引:不能保证跨行原子性,可能导致数据表和辅助索引表中数据不一致。
(2)、ITHBase ( Indexed-Transactional HBase ) :事务支持可以保证所有的辅助索引更新操作一致性。增加了同步开销,不能与最新HBase绑定。
(3)、IHBase (Indexed HBase) : 不为每个索引使用单独的表,而是完全在内存中维护索引。 需要额外的资源满足IO,不能与最新HBase绑定。
(4)、协处理器:
6、事务
(1)、ITHBase ( Indexed-Transactional HBase )
(2)、ZooKeeper:可以实现事务。
7、Bloom 过滤器
(1)、Bloom过滤器原理:当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
优点:相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数()。另外, 散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。
缺点:有一定的误识别率和删除困难。
(2)、在HBase中使用:用户可以快速判断一个文件是否包含特定的行健。如果Bloon过滤器检测文件后,答复说不包含,则肯定不包含;如果包含Bloom过滤器答复说包含,则有可能有错,文件可能包含也可能不包含,默认是1%的误判率,因此可能有1%的多余文件块被加载。这样减少不必要的块加载量,减少 IO,提升整个集群的吞吐率。
(3)、一般使用行级Bloom过滤器,行级不行才使用行加列级。
8、版本管理
(1)、如果集群的服务器时间不一致,有一台服务器A超前1小时,用户将一个值存储在A并使用隐式的时间戳。10分钟后这个region被拆分,用户一半的数据更新被移到另一个服务器上。5分钟后,当用户再向同样的列插入一个新的值,服务器会自动添加时间戳,此时新值会被以前的数据更老,从而造成错误。
(2)、若默认配置保留3个版本,向同一个列插入10次值,则Get所有版本时候,只能得到最新的3个值。但是删除最后两个版本之后,老版本的数据还可能Get到,引起”复活“现象。直到Major合并之后,老版本会被永久删除,再也拿不到。
(3)、删除标记:删除的本质是添加一个带有特定时间戳的墓碑标记到存储中。