HBASE高级应用
1、行健或表设计
基本原则是尽量把查询的维度或信息存入行健中,因为这样筛选数据的效率最高。从表的形式看,主要有列少行多的高表和行多列少的宽表,一般情况下高表更有优势,因为hbase只能按行拆分。
防止数据过热:当时间序列类型的数据(行健为时间戳)写入时,数据集中在一个region中,很容易产生读写热点。解决办法有:1)添加hash前缀,2)字段交换或提升权重:即在行键中添加另外一个字段或交换杭建中多个字段的位置,3)随机化,比如对整个行健取MD5,作为新的行健。以上方法顺序度的性能由高到低,而写入的速度由低到高。
行健决定数据的读取维度或模式,数据行行健有序。但如果需要额外的读取顺序,则可以给表添加格外的列族,用于存储其他读取顺序的索引。比如:对于收件箱应用,行健为userID,data列族存消息数据(列名为messageID,值为消息内容),而idx列族存索引(列为标示+消息主题,值为附加信息)。这样就可以在读取索引列族时,得到按主题有序的数据。
2、辅助索引
辅助索引是为了数据可以按行健之外的方式快速定位数据。解决方案有:
1)由客户端管理索引:维护数据表和辅助索引表两个表。当数据写入时,除了写入数据外,还要将数据表的行健写入索引表。这些操作全部由应用层客户端完成,很灵活,但是缺少事务特性,当数据写入成功而索引失败时两个表将不同步,可以采用定期修剪(如周期性的跑mapreduce任务来删除或增加不一致的条目)解决。
2)带索引的事务性HBASE(ITHBASE):开源、扩展了hbase,主要增加保证所有辅助索引更新一致性的事务功能。同样需要数据表和辅助索引表两张表,跟客户端管理索引不同的是这些操作都在服务器端自动完成。缺点是独立于hbase发行,可能不支持某些版本的hbase。
3)带索引的hbase:不同以上两种方式为每个索引单独建表存储,这种方式直接在内存存储索引。当region第一次被打开或者memstore被刷写到磁盘时,通过扫描整个region来建立索引。这种方式可能消耗大量的IO和时间资源,入侵性很强,在按照辅助索引定义的顺序查找时数据表上做的是随机查找,也存在hbase版本兼容问题;优点是数据时同步的不需要额外的事务支持,而且支持类型如byte等。
4)协处理器:使用协处理器框架提供的服务器端的钩子函数实现类似于ITHBASE和IHBASE的索引,但不需要替换任何服务器端类。协处理器为每个region载入索引层,并维护索引。
3、搜索集成
辅助索引可以按行健意外的顺序遍历表,但不能用任意关键字来搜索数据。实现方式有:
1)客户端管理索引:hbase存储数据,mapreduce任务生成索引,还需用hbase作为Lucene的后台存储。另一种实现方法是把数据表的更新也转发到邻近的索引服务器中。一个实现是facebook的收件箱搜索系统:每行是一个单独的收件箱即一个用户一行;列消息中被索引的词,时间戳是消息ID,值是附加信息如词在消息中的位置。
2)Lucene:一个外部托管的项目提供了BuildTableIndex类,这个类以前是hbase中contrib的一部分。该类扫描整个表并建立Lucene索引并存在hdfs上。这种方式只使用hbase存储数据。
3)HBasene:直接在hbase内部建立搜索索引,并提供lucene API。
4)协处理器:协处理器提供的钩子维护索引,索引直接存储在hdfs上,每个region都有自己索引,通过搜索分布在所有region上的索引以获取完整的结果。
4、事务
1)事务型HBASE:ITHbase有一些取代默认客户端类和服务器端类的扩展类,增加啦跨行甚至跨表的事务支持。每个region都保持了一个事务列表,从beginTransaction开始,到commit结束。每次读写操作有一个事务ID,保证不受其他事务影响。
2)zookeeper:利用znode实现分布式锁。
5、布隆过滤器
布隆过滤器有两种:行级过滤器和行加列级的过滤器。特别注意的是:当数据表中不包含特定的行时,布隆过滤器给出正确回答;相反则不一定正确;表数据在major合并之前,会存在很多文件,常规查找要加载所有可能包含特定行的所有文件的某个数据块,然后遍历这些数据块看是否真包含这些数据。因此,使用布隆过滤器的前提之一就是,同一行数据更新集中在少数存储文件上,要不然通过布隆过滤器也无法排除文件,还是得加载这些文件中的特定块。单元格比较小才合适加布隆过滤器,否则,不拢过滤器占用的空间会很大,反而增加IO负担。使用行加列不拢过滤器的的情况是:更新的一行数据分布在大部分存储文件,每个存储文件包含该行的一部分,且更新小部分列,且读模式为按列读。综上,决定是否使用布隆过滤器,取决于数据表的读写模式和单元格大小,而过滤原则是能有效过滤掉更多的存储文件。
6、版本管理
数据的版本或时间戳分隐式上版本管理和显式版本管理。隐式版本会有一些问题存在,主要发生在集群机器时间不同步时。如客户端写入一行数据,region服务器时间慢1小时,假如客户端再读出最近一个小时的数据,则会把刚写入的数据遗漏。另外,region拆分时把region一分为二,假如一个子region被分配到另外一台机器上,当另外这台机器更新数据时,可能时间戳小于之前的时间戳,从而导致最近更新的数据被认为是老数据。
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐