生产环境使用HBase,你必须知道的最佳实践

简介: 生产环境使用HBase,你必须知道的最佳实践

1.Schema设计七大原则


1)每个region的大小应该控制在10G到50G之间;


2)一个表最好保持在 50到100个 region的规模;


3)每个cell最大不应该超过10MB,如果超过,应该有些考虑业务拆分,如果实在无法拆分,那就只能使用mob;


4)跟传统的关系型数据库不同,一个HBase的表中列族最多不超过3个,列族中的列可以动态添加的,不要设计过多列族;


5)列族名必须尽量短,因为我们知道在存储的时候,每个keyvalue都会包含列族名;


6)如果一个表存在一个以上的列族,那么必须要注意,不同列族之间行数相差不要太大。例如列族A有10万行,而列族B有1亿行,那么rowkey就有1亿行,而region是按照行键进行切分的,因此列族A可能会被打散为很多很多小region,这会导致在扫描列族A时会引发较多IO,效率低下。


7)列族可以设置TTL时间,HBase在超过设定时间后,会自动删除数据。

设置方法有两种:


# 建表时设置,TTL单位为秒,此例中列簇'f1'的数据保留1天(86400秒)

hbase(main):002:0>create'table',{NAME=>'f1',TTL=>86400}


# 通过修改表设置


hbase(main):002:0>alter'table',{NAME=>'f1',TTL=>86400}


这里需要注意,一旦超过设定时间后,该数据就无法读取了,但是,真正的过期数据删除,是发生在major compaction时。


2.RowKey设计三大策略


HBase作为一个分布式存储数据库,虽然扩容非常容易,但是,对于“热点”问题,还是非常头疼的。


所谓“热点”问题(HotSpotting),就是请求(读或者写)短时间内落在了集中的个别region上,导致了该region所在机器的负载急剧上升,超过了单点实例的承受能力,从而引起性能下降或者不可用。


要解决这个问题,就需要设计RowKey时,使得数据尽量往多个region上去写。


举个例子:


假如region按照26个字母分成26个,那么同时写入m开头的rowkey的记录都会同时写入同一个region


比如m001,m002,m003,m004,m005。


因此,RowKey的设计非常关键。常见的设计策略有这么几种。


1)salting


salting策略就是将生成随机数放在行键的开头作为前缀,使得每个行键有随机的字典序。


对上面的案例进行优化,我们采用了salting策略,插入前给每个rowkey生成一个随机的字母,变成了


am001,zm002,nm003,qm004,lm005


这样就能同时往5个region里面写入了,成功打散。


副作用:由于前缀生成是随机的,因此如果想要按照字典序查询这些行,则需要做更多的事情。从这个角度上看,salting增加了写操作的吞吐量,却也增大了读操作的开销。


2)Hashing


Hashing策略也是一种特殊的salting,是用一个单向的 hash 来取代随机指派前缀。


这样能使一个给定rowkey的行在“salted”时有相同的前缀,因此,这样既可以分散RegionServer间的负载的,同时也允许在读操作时能够预测这个前缀值是什么。确定性hash( deterministic hash )可以让客户端重建完整的行键,然后就可以像正常一样用Get方法查询确定的行。


3)reverse key


第三种预防hotspotting的方法是反转一段固定长度或者可数的键,让变化最多的某个位置放在rowkey的第一位,


副作用:对于Get操作没有影响,但是不利于Scan操作进行范围查询,因为数据在原RowKey上的顺序已经被打乱。


3.预分区


在 HBase核心特性—region split 中,我们知道已经提到过关于预分区。


主要原因是当一张表被首次创建时,只会分配一个region给这个表。因此,在刚刚开始时,所有读写请求都会落在这个region所在的region server上,而不管你整个集群有多少个region server。不能充分地利用集群的分布式特性。


因此,预分区主要也是解决“热点”问题。


最为常见的建表语句为:


create ‘tb’,{NAME => ‘f1’,COMPRESSION => ‘snappy’ }, { NUMREGIONS => 50, SPLITALGO => ‘HexStringSplit’ }


  • NUMREGIONS 为 region的个数,一般按照每个region 8-10GB左右来计算region数量,如果集群规模非常大,那么region数量可以适当取大一些
  • SPLITALGO 为 rowkey分割的算法,Hbase自带了三种pre-split的算法,分别是 HexStringSplit、DecimalStringSplit 和 UniformSplit。


各种Split算法适用场景:


  • HexStringSplit: rowkey是十六进制的字符串作为前缀的
  • DecimalStringSplit: rowkey是10进制数字字符串作为前缀的
  • UniformSplit: rowkey前缀完全随机


4.读性能优化


前面主要讲一些设计方面的优化点。


那如果在HBase的使用过程中,发现查询较慢,那么就需要根据具体情况,分析查询慢的原因,并采取相应的策略。


现象:只有某个业务查询慢,其他业务并不慢,HBase集群也不慢
排查客户端
Scan是否设置合理的缓存(setCatch)

Get请求是否设置为批量
排查列族设计
是否设置BloomFilter?

是否设置了合理的TTL?
排查HDFS
数据本地化率是否过低?
现象:HBase集群查询很慢
HBase服务端问题
BlocCache配置是否合理?

HFile数量是否过多?

Compaction是否过于频繁?


现象:某个查询上线后,其他查询都变慢了
客户端问题
大scan是否设置了setBlockCache=false?
服务端问题
读请求是否均衡

region分布是否均衡

region server的traffic是否均衡
相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
SQL 搜索推荐 Java
「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
550 0
「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践
|
存储 缓存 算法
生产环境使用HBase,你必须知道的最佳实践
前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验。 1.Schema设计七大原则 1)每个region的大小应该控制在10G到50G之间; 2)一个表最好保持在 50到100个 region的规模; 3)每个cell最大不应该超过10MB,如果超过,应该有些考虑业务拆分,如果实在无法拆分,那就只能使用mob; 4)跟传统的关系型数据库不同,一个HBase的表中列族最多不超过3个,列族中的列可以动态添加的,不要设计过多列族; 5)列族名必须尽量短,因为我们知道在存储的时候,每个keyvalue都会包含列族名;
216 0
|
监控 分布式数据库 API
HBase TB级数据规模不停机迁移最佳实践
有关HBase集群如何做不停服的数据迁移一直都是云HBase被问的比较多的一个问题,目前有许多开源的工具或者HBase本身集成的方案在性能、稳定性、使用体验上都不是很好,因此阿里云提供了BDS迁移服务,可以帮助云上客户实现TB级数据规模不停机迁移
6014 0
|
存储 NoSQL 分布式数据库
案例篇-HBase 在滴滴出行的应用场景和最佳实践
李扬 滴滴出行 资深软件开发工程师
2623 0
|
存储 缓存 Java
HBase最佳实践-读性能优化策略
任何系统都会有各种各样的问题,有些是系统本身设计问题,有些却是使用姿势问题。HBase也一样,在真实生产线上大家或多或少都会遇到很多问题,有些是HBase还需要完善的,有些是我们确实对它了解太少。总结起来,大家遇到的主要问题无非是Full GC异常导致宕机问题、RIT问题、写吞吐量太低以及读延迟较大。
2147 0
|
机器学习/深度学习 SQL 分布式计算
云HBase Phoenix索引构建最佳实践
介绍三种的不同的索引构建方法及其适用场景
2666 0
|
监控 分布式数据库 Python
云HBase Thrift使用最佳实践
  HBase原生只提供了JAVA API客户端,针对诸如python、php、c++等非java语言一般都是通过Thrift代理的方式访问HBase服务,本文从thrift架构、hbase thrift api使用以及如何监控thrift等几个方面详细介绍云HBase Thrift使用最佳实践;  Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。
1941 0
|
存储 缓存 Java
技术篇-HBase 最佳实践-读性能优化策略
任何系统都会有各种各样的问题,有些是系统本身设计问题,有些却是使用姿势问题。HBase也一样,在真实生产线上大家或多或少都会遇到很多问题,有些是 HBase 还需要完善的,有些是我们确实对它了解太少。总结起来,大家遇到的主要问题无非是 Full GC 异常导致宕机问题、RIT 问题、写吞吐量太低以及读延迟较大。
2472 0
|
缓存 算法 分布式数据库
|
3月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
121 4
下一篇
DataWorks