前面,我们已经打下了很多关于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的使用过程中,发现查询较慢,那么就需要根据具体情况,分析查询慢的原因,并采取相应的策略。

看到这里了,原创不易,点个关注、点个赞吧,你最好看了~

知识碎片重新梳理,构建Java知识图谱:https://github.com/saigu/JavaKnowledgeGraph(历史文章查阅非常方便)

扫码关注我的公众号“阿丸笔记”,第一时间获取最新更新。同时可以免费获取海量Java技术栈电子书、各个大厂面试题。

 

「从零单排HBase 06」你必须知道的HBase最佳实践的更多相关文章

  1. 「从零单排canal 06」 instance模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  2. 「从零单排canal 04」 启动模块deployer源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  3. 「从零单排canal 05」 server模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  4. 「从零单排canal 07」 parser模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  5. 「从零单排canal 03」 canal源码分析大纲

    在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ...

  6. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...

  7. 「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)

    canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Service)的开 ...

  8. 《HBase在滴滴出行的应用场景和最佳实践》

    HBase在滴滴出行的应用场景和最佳实践   背景 对接业务类型 HBase是建立在Hadoop生态之上的Database,源生对离线任务支持友好,又因为LSM树是一个优秀的高吞吐数据库结构,所以同时 ...

  9. 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

    Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...

随机推荐

  1. Range Sum Query - Immutable(easy)

    1.这道题目与pat中的1046. Shortest Distance (20)相类似: 2.使用一个数组dp[i],记录0到第i个数的和 3.求i到j之间的和时,输出dp[j]-dp[i]+num[ ...

  2. iOS数据锁

    简介 当一个线程访问数据时,而其他数据不能进行访问,保证线程安全或者可以理解为执行多线程,对于共享资源访问时保证互斥的要求 文章 不再安全的 OSSpinLock iOS开发中的11种锁以及性能对比 ...

  3. JVM组成与作用

    class loader 类加载器:加载类文件到内存.Class loader只管加载,只要符合文件结构就加载,至于能否运行,它不负责,那是有Exectution Engine 负责的.exectio ...

  4. navisworks卸载/完美解决安装失败/如何彻底卸载清除干净navisworks各种残留注册表和文件的方法

    在卸载navisworks重装navisworks时发现安装失败,提示是已安装navisworks或安装失败.这是因为上一次卸载navisworks没有清理干净,系统会误认为已经安装naviswork ...

  5. Python自动化之数据驱动(转载下自己的日常练习笔记)

    一.execl数据驱动 1.xlutils简要说明 导包:pip3 install xlutils 注意⚠️:xlutils在介些Execl文件的时候,只识别.xls后缀的文件,如果是.xlsx后缀的 ...

  6. t-检验

    https://wenku.baidu.com/view/3954f9d9a58da0116c17497b.html介绍的挺好的,可以查看~ 应用方面:用于推断差异发生的概率,与f检验,卡方检验并列 ...

  7. spring整合ehcache实现缓存

    Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现.它支持注解方式使用缓存,非常方便. spring本身内置了对Cache的支持,之 ...

  8. 理解 Redux 中间件机制

    Redux 的 action 是一个 JS 对象,它表明了如何对 store 进行修改.但是 Redux 的中间件机制使action creator 不光可以返回 action 对象,也可以返回 ac ...

  9. 迈克尔·乔丹:几百年内AI不会觉醒

    ​​ 此乔丹非飞人乔丹.他是研究统计学和计算机科学家,目前研究的领域正是普通人所说的人工智能.权威的学术搜索引擎Semantic Scholar在2105年做了一项排名,关于计算机科学领域谁最具影响力 ...

  10. C++扬帆远航——11(斐波那契数列)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:Feibo.cpp * 作者:常轩 * 微信公众号:Worldh ...