做么是HBase
现在国内互联网环境一片大好,大数据的技术知识也不断的被应用,想要用好这些大数据技术还是比较难的。像HBase、redis、MQ、kafka等都是经常用到的,今天来给大家M r g ? _ ` f %介绍一下HBase。
HM 7 6 s p P + :Base是什么?HBase其实就是一个分布式的、面向列的开源数据库,与其它数据库不同的是HBase是一个适合于非结构化数据存储的数据库。
它具有高可靠性、高性能、面向列、可伸缩等特性,所以从普通的数据库向HBase中迁移数据也会非常的简单。
Schema设计七大原则
1)每个region的大小应该控制h s ] 1在10G到50G之间;
2)一个表最r & e n d Q p 8 好保持在 50到100个 region的规模;
3)每个cell最大不应该超过10MB,如果超过,应该有些考虑业务拆分,如果实在@ K c 4无法拆分,那就只能使用mob;
4)跟传统的关系型数据库不同,一个HBase的表中列族最多不超过3个,列族中的列可以动态添加的,不要设计过多列族;
5)列族名必须尽量短,因为我们知道在q S L a %存储的时候,每个keyz 2 * ~ M k value都会e 7 6 X包含列族名;
6)如果一个表存在一个以上的列族,那么必须要注意,不同列族之间行数相差不要太大。例如列族A有10万行,而列族B有1亿行,那么rowkey就有1亿行,而region是按照行键进行切分的,因此列族A可能会被打散为很多很多小region,这会导p ~ i (致在扫描列族A时会引发较多IO,效率低下。
7)列族可以设置TTL时间,HBase在超过设定时间后,会自动删除数据。
RowKey设计三大策略
HBase作为一个分布式存储数据库,虽w L 9 (然扩容非常容易,但是,对于“热点”问~ * ,题,还是非常头疼的。
所谓“热点”问题(Ho5 y A ftSpotting),就是请求(读或者写)短时间内落在了集中的个别region上F l u ] J q A = f,导致了该region所在机器的负载急剧上升,超过了单点实例的承受能力,从而引起性能下降或者不可用。
要解决这个问题,就需要设计RowKey时,使得数据尽量往多个region上去写。
举个例子:
假如region按照26个字母分成26个,那么同时写入m( 9 y 6 L开头的rowkey的记录都会同时写入同一个region
比如m001,m002,m003A +,m004,m005。
因此,RowKey的设计非常关键。常见的设计策略有这么几种。
1)salting
salA q y | S W -ting策略就是$ r ! q将生成随机数放在行键的开头作为前缀,使得每个行键有随机的字典序。
对上面的案例进行优化,我们采用了salting策略,插入前给n 8 J % F | y N每个rowkey生成一个随机的字母,变成了
am001,zm002,nm003,qm004,lm005
这样就能同时往5个region里面写入了,成功打散。
副作用:由C _ - r o E O r于前缀生成是随机的,因此如果想要按照字典序查询这些行,则需) @ #要做更多的事情。从这个角度2 - G上看,salting V ! s ? U增加了写操作的吞吐量,却也增大了读操作的开销。
2)Hashing
Hashing策略也是一种特殊的salting,是用一个单向的 hash 来取代随机指派前缀。
这样能使一个给定rowkey的行在“salted”时D J O [ & w T b ]有相同的前缀,因此,这样既可以分散RegionServer间的负载的,同时也允许在读操作时能够^ w _预测这个前缀值是什么。确定性hash( determini5 U J ` s 0 u )stic has, W : q _ M & !h )可以让客户端重建完整的行键,然后就可以像正常一样用Get方法查询确定的行。
3)reverse key
第三种n 4 _ q G预防hotspotting的方法是反转一段固定长度或者可数的键,让变化最多的某个位置放在rowkey的第一位,
副作用:对于Get操作没有影响,但是不利于Sca7 & V Bn操作进行范围查询,因为数据在原RowKey上的顺序B B h I T已经被打乱。
预分区
在! $ _ E U ] u V c HBase核心特性—. 5 1 Q P w V 2 mregion split 中,我们知道已经提到过关于预分区。
主要原因是当一张表被首次创建时,只会分配一个region给这个表。因此,在刚刚开始时,所有读写请求都会落在这个region所在的region server上,而不管你整个集群有多少个region server。不能- H I d充分地利用集群的分布式特性。
因此,预分区主要也是解决“热点”问题。
最为常见的建表语句为:
create ‘tb’,{NAu 7 e # r 1 6 cME => ‘f1’,COMPRES2 i ; 9 ; ?SION => ‘snapp3 ] z 6y’ },C & ` 3 * | ? t { NUMREGIONS => 50, SPLITALGO => ‘HexStringSplit’ }
- NUMREGIOc O : : c J cNS 为 region的个数,一般按照每个region 8-10GB左右来计算region数量,如果集群规模非常大,那么region数量可以适当取大一些
- SPLITALGO 为 rowkey分割的算法,Hbase自带了三种pre-split的算法x : ) I h K M,S z B分别是 HexStringSplit、DecimC J v c { A F oalStringSplit 和 UniformSF n ] 1 pplit。
各种Split算法适用场景:
- HexStri! 7 5 9 9ng, ! d @ LSplit: rowkey是十六进制的字符串作为前缀的
- DecimalStringSplit: rowkey是10进制数字字符串作为前缀的
- UniformSplit: rowkey前缀) 4 & [ 9 z完全随机
读性能优化
前面主要讲一些设计方面的优化点。
那如果在HBase的使S e W - x F [ 0用过程中,发现查询较慢,+ D Y {那么就需要根据具体情y P G g Q . 7 f况,分析查询慢的原因,并采取相应的策略。