各位老师,单位现在要引入hbase数据库作为数据存储,并将数据通过接口方式返回给查询方。目前的场景是这样的,数据每日全量加载,以每日最新的数据为有效数据,数据量在500万左右。
前期做了一定尝试和探索,做出了以下调整:
- rowkey是用户id,查询方通过用户id直接查询。由于一开始没有加入分区,发现频繁写入数据后,hbase的数据会出现短暂的不可读,报region is not online的错误。从网上查询后,说是hbase数据量到一定程度,会自动分裂,针对此问题,我们强制在建表时设定了 no split 策略,并按照首位 进行 {10,20,30,。。。}的预分区。
- 数据是每日全量加载,通过定时任务将所有数据put到hbase。但是每日的数据和历史的数据rowkey不完全一致,比如新增用户或者失效用户。新增用户其实问题不大,直接put到库里就可以。但是失效用户其实应该是被删除的。考虑到尽量保证数据24h小时可用,目前的想法是根据时间戳和加载时间做一下判断,单独启一个删除的定时任务,在每日加载做完后,执行这个删除任务,将过期数据删除掉。
针对上述场景,目前我们遇到了一下问题:
分裂策略方面,no split策略目前在查询层面表现还是比较稳定的,不会出现region is not online的问题,但是这种方法可持续强吗?有更好的方法吗?
删除方面,我们在测试的时候试过频繁写入并按照时间戳标签删除,这期间出现过一段短时间的数据不可读,一直报节点不可用,大概过了5分钟恢复了一部分数据的可读性,又过了几分钟大部分数据可读了。网上搜了下,多是说这期间hbase在做compact操作,导致数据的短时间不可用。这个compact策略我们怎么才能很好的避免其对数据可读性的影响?
另外就是删除操作的具体实现,我们目前每次做删除操作时,会全表scan所有数据找到rowkey,再根据rowkey和时间戳去表中删除,这种思路感觉有些绕路,每次scan的速度也不是很快。应对这种删除场景各位老师有什么好的实现思路吗?
新人第一次提问,不周之处还望多多包涵,在此先谢过大家了。