内容来源于哔哩哔哩网站的尚学堂大数据课程
Hbase的简单使用:
开启:hbase shell
帮助:help
建表:create 'test','cf'
查看所有表:list 'test'
表详细信息:describe 'test'
添加表信息:put 'test','row1','cf:a','value1'
pub <表名>,<RowKey>,<列簇:列名>,<值>
浏览表:scan 'test'
取行:get 'test','row1'
禁用表:disable 'test'
可用:enable 'test'
删除表:drop 'test' //删除之前需要先禁用表
退出:quit
Hbase在项目中的使用难点
1.RowKey的设计:Hbase主要是使用RowKey进行数据查询的,设计要避免热点数据和数据倾斜问题
2.复杂查询需求
- 面对复杂需求时,难以通过RowKey直接索引到数据,若索引无法命中,则只能进行大范围或全表扫描才能定位数据。
- 手动在事务产生时将索引写入到Hbase表中
- 通过Phoenix构建索引
3.多语言连接问题
Hbase的热点现象:
检索hbase的记录是通过rowkey来定位数据行的,当大量的client访问hbase集群的一个或者少数节点,造成少数region server的读写请求过多,负载过大,而其他region server负载缺很小,就造成了“热点现象”。
热点的危害:
大量的访问会使热点region所在单个主机负载过大,引起性能下降甚至region不可用。
热点产生原因:
有大量连续编号的row key==> 大量rowkey相近的记录集中在个别region中 ==>
client检索记录时,对个别region访问过多 ==> 此region所在的主机过载
==> 热点
解决方法:
尽量均衡地把每一条记录分散到不同的region里去!
下面是一些常见的避免热点的方法以及它们的优缺点:
加盐
这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。给多少个前缀?这个数量应该和我们想要分散数据到不同的region的数量一致(类似hive里面的分桶)。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。
哈希
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
反转
第三种防止热点的方法是反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。
反转rowkey的例子:以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,从而避免诸如139、158之类的固定号码开头导致的热点问题。
时间戳反转
一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用Long.Max_Value - timestamp追加到key的末尾,例如[key][reverse_timestamp] ,[key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。