背景:
需要记录用户最近x天内浏览过和下过单的live房间记录
过程:
从hive捞了一波数据,发现有几亿条,初步选型为hbase,之后的工作可以说是折腾了我三天一夜,特此记录,省的下次再浪费时间
步骤:
1、需要在hive创建数据时建立一列rowkey列用来做导入hbase的rowkey
rowkey设计规则:一般建议定长,就算为了节省空间不是定长,split的前缀必须定长!!!!不然就会导致数据导入不均衡
exp:2wqps ,20G数据,7天ttl的量级数据大概需要至少14个region,如果想要均分到14个region上,我的rowkey一开始设计为(userId%100)8_(userId)_(房间Id)_(pt分区字段)
以userId作为前缀的条件是在当前场景下userId足够散列,并且userId可以作为入参用来生成rowKey,其实如果选择随机数作为前缀更好,但是要考虑到在hive上游生成随机数怎么通过服务端入参给到查询hbase的接口里比较复杂,要设计两端即服务端与hive上游的随机种子和随机算法保证一致之类,所以最后还是选择用userId来当成rowKey前缀,在这里,为了让userId更加散列,我通过userId mod 100(mod数要比region大因为要打的足够散)做前缀,由于我在建立hbase的时候,设置了8位splitKey以及decimalString(数字)做为split格式,所以第一次compact的时候会把前缀为00000000-99999999的数据均分给14个region,也就是大概是00000000-07142857是第0个region,07142857-14285714是第1个region,每07142857个前缀循环,直到最后第13个region结束,那么需要注意的是!!!userId % 100要保持定长2位,不然就会不均衡,1xxxxxxx和10xxxxxx会被分到一起,2xxxxxxx和20xxxxxx会被分到一起,3xxxxxxx和30xxxxxx会被分到一起,最后就会出现region0数据特别少的情况。
RPAD(LPAd(userId%100,2,0),8,0)_(userId)_(房间Id)_(pt分区字段)
OR
RPAD(substring(userId,-2),8,0)_(userId)_(房间Id)_(pt分区字段)