背景
最近有个简单的需求,离线数据挖掘得出的标签需要支持online的查询,查询场景比较简单,支持按照单个id或者多个id批量查询,tp99需要在200ms,批量的时候id 集合的大小不会超过1000,平均下来不会超过200的样子。这种场景直接上ES相对来说比较省事,不过ES占用资源较多,想尝试用hbase来解决这种场景,下面记录下具体的过程。
为何要考虑HBase?
为何要用hbase呢?离线数据是存放在hive表里面的,虽然hbase导入hbase和es都挺方便的,不过据我们测试的情况看,hive2hbase采用bulkload 的方式会快些,而且比较简单。导入es的过程中步骤繁琐,需要设置刷新时间和副本数,设置段合并和别名之类的操作,相对来说麻烦许多。hbase按照 rowkey查询的性能还行,单次查询在10+ms左右,虽然支持索引,不过性能差强人意,暂时不准备利用其自身的索引。 只利用hbase来存储元信息,这些信息相对来说比较占空间,仅支持按照 rowkey来查找。
HBase的若干问题
- rowkey的设计,这个关系到数据是否分布均匀,一般根据业务场景强相关,我们这个就是按照id来设计的查询,前期考虑根据id的首个数字来进行划分,后来发现 region server 存在严重的热点问题,看了下数据才发现,我们的id是子增的,而且id比较大,主要都落到2,3开头的region里面了,对于自增的id可以采用id%n 的方法来划分ÿ