欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

hive导入hbase笔记

时间:2023-06-18

背景:

需要记录用户最近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分区字段)

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。