叮咚~你被福利砸中了!现在起,「2020 AI开发者万人大会」299门票免费送!进入报名页面【2020 AI 开发者万人大会(线上直播门票)-IT培训直播-CSDN学院】,点击“立即报名”,结算时使用优惠码“AIP1410”,价格就会变为“0"元!

前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验。

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时。

.

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上的顺序已经被打乱。

预分区

在 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前缀完全随机

读性能优化

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

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

hbase中为何不能向表中插入数据_生产环境使用HBase,你必须知道的最佳实践 | 百万人学AI...相关推荐

  1. 文件表单带数据一起提交spring_基于 Spring 实现管道模式的最佳实践

    管道模式(Pipeline Pattern) 是 责任链模式(Chain of Responsibility Pattern) 的常用变体之一.在管道模式中,管道扮演着流水线的角色,将数据传递到一个加 ...

  2. Hibernate 学习心得1: 多对多关系中,中间表无法插入数据。

    Hibernate 学习心得之一 多对多关系中,中间表无法插入数据. 最近学习 spring4+hibernate4,学习中遇到了很多坑. 在这里我来说说我遇到的坑,这里就不介绍如何spring如何集 ...

  3. oracle into多个变量,Oracle中merge into的使用:该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据....

    该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1,ins ...

  4. cte公用表表达式_CTE SQL删除; 在SQL Server中删除具有公用表表达式的数据时的注意事项

    cte公用表表达式 In this article, the latest in our series on Common table expressions, we'll review CTE SQ ...

  5. oracle查表字段长度,oracle中查询某张表中的字段名,字段类型,字段长度等信息...

    oracle中查询某张表中的字段名,字段类型,是否为空,字段长度等信息 --更改某张表的字段类型长度 alter table bill_info modify IDCARD VARCHAR2 (30) ...

  6. #ArcGis中如何对属性表中的字段进行顺序赋值??

    #ArcGis中如何对属性表中的字段进行顺序赋值?? 如题,昨天有小伙伴在公号私信里问我"如何在ArcGis中对属性表中的字段进行顺序赋值??"这个问题如果会一点python编程, ...

  7. jtable如何从表格中定位_ja中怎样将一个JTable表中的指定行添加到数据库

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:ja中怎样将一个JTable表中的指定行添加到数据库用的是回答:你首先得获取你选择的指定行 (getselectrow()方法),再 ...

  8. Windows注册表中保存的信息及环境变量中SystemRoot在注册表中的位置

    Windows注册表中的几个分项分别是什么 HKEY_LOCAL_MACHINE 是机器硬件信息的集散地 HKEY_CURRENT_USER 当前用户所用信息的储存地 HKEY_CLASSES_ROO ...

  9. SQL数据库中如何把一个表中的数据复制到另一个表中?

    SQL数据库中如何把一个表中的数据复制到另一个表中?** 1整个表复制:** insert into table1 select * from table2 2部分列复制:** insert into ...

最新文章

  1. 比尔.盖茨人生的四张面孔
  2. 一个TreeView 样式表
  3. golang应用日志
  4. 使用过滤器模式,让客户关怀中的代码更加干净整洁
  5. react-性能优化
  6. 灰色关联法 —— python
  7. 客座编辑:杜小勇(1963‒),中国人民大学信息学院教授,博士生导师。
  8. go 数组任意位置插入数字类型的元素
  9. destoon php文件,Destoon模板制作简明教程
  10. 开课吧:电商产品数据分析的核心目标是什么?
  11. ricequant量化交易文件如何保存和读取
  12. 有电流平衡能力的6组白光LED驱动器MAX8790
  13. 根据year年的第week周,查询第week周的起止时间
  14. 【美萍超市管理系统】汉码盘点机无缝对接 金蝶盘点机条码数据采集器智能终端PDA
  15. # 老外对中国人写英语文章最常犯的错误总结csdn
  16. css预处理全部知识点一文讲清楚
  17. C语言讲义——预处理
  18. cad中怎么随意移动图形_CAD中需要挪动图形到准确位置?试试这几种方法
  19. 【VS2012】绝对的偶遇
  20. kill -kill 20071125 20080101

热门文章

  1. Asp.Net Forums研究文章集合(收藏)
  2. 25-限制容器对内存的使用
  3. nodejs学习文档(一) 认识node.js
  4. http服务ajax编程
  5. Handler基本概念
  6. (转载)Vim入门图解说明
  7. text-overflow:ellipsis溢出显示省略号兼容所有浏览器的解决办法
  8. WAV格式中常见的压缩编码
  9. SQL2005性能分析一些细节功能你是否有用到?(二)
  10. 构造函数及其参数列表初始化问题