大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章目录
- 前言:
- 一、 HBASE来源
- 二、 HBASE介绍
-
- HBase定义
- HBase特性
- HBASE与RDBMS和NOSQL区别
- HBASE应用场景
- 三 HBASE表模型
-
- HBASE表模型的要点
- HBASE的表中能存储数据类型
- HBASE表的物理存储结构
- HBASE工作机制图示
- 组件说明
- 四、HBASE的rowKey设计原则与热点问题的解决(面试常问)
-
- 1 设计原则
-
- hbase的行键设计三原则
- 列簇的设计原则
- rowkey的设计原则
- 2 热点问题
-
- 通常有3种办法来解决这个Region热点问题:
前言:
第一次带女友回家,妈妈好像特别喜欢女友,晚饭后留她在我家住一、 HBASE来源
我小声说道:妈,这样不好吧?我们还没到那步呀!
妈妈笑道:想什么呢,你身材好又那么漂亮,我不愁你娶不到媳妇,我等会想叫你弟弟来认识认识,这小姑娘人不错。。。
文章图片
- hbase是一个开源的、分布式的、多版本的、可扩展的、非关系型的数据库。
- hbase是big table的开源的java版本,建立在hdfs基础之上,提供高可靠性、高性能的、列式存储、可伸缩、近实时读写的nosql的数据库系统
- 数据量越来越大,传统的关系型数据库不能满足存储和查询的需求。而hive虽然能够满足存储的要求,但是hive的本质也是利用底层的mr程序,所以读写速度不快。而且hive不能满足非结构化的、半结构化的存储,hive的主要作用是做分析和统计,hive用于存储是无意义的。
HBASE是一个数据库----可以提供数据的实时随机读写
HBASE与mysql、oralce、db2、sqlserver等关系型数据库不同,它是一个NoSQL数据库(非关系型数据库)
文章图片
HBase特性 Hbase的表模型与关系型数据库的表模型不同:
- Hbase的表没有固定的字段定义;
- Hbase的表中每行存储的都是一些key-value对
- Hbase的表中有列簇的划分,用户可以指定将哪些kv插入哪个列族
- Hbase的表在物理存储上,是按照列簇来分割的,不同列簇的数据一定存储在不同的文件中
- Hbase的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复
- Hbase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,hbase不负责为用户维护数据类型
- HBASE对事务的支持很差
文章图片
HBASE与RDBMS和NOSQL区别
HBase的表数据存储在HDFS文件系统中。 从而,hbase具备如下特性:存储容量可以线性扩展; 数据存储的安全性可靠性极高!HBASE应用场景
- hbase的表模型跟mysql之类的关系型数据库的表模型差别巨大
- hbase的表模型中有:行的概念;但没有字段的概念
- 行中存的都是key-value对,每行中的key-value对中的key可以是各种各样,每行中的key-value对 的数量也可以是各种各样
文章图片
三 HBASE表模型 HBASE表模型的要点
HBASE的表中能存储数据类型
- 一个表可以分为多个列簇(不同列簇的数据会存储在不同文件中)
- 表中的每一行有一个“行键rowkey”,而且行键在表中不能重复 4、表中的每一对kv数据称作一个cell
- hbase可以对数据存储多个历史版本(历史版本数量可配置)
- 整张表由于数据量过大,会被横向切分成若干个region(用rowkey范围标识),不同region的数据也 存储在不同文件中
- hbase会对插入的数据按顺序存储:
5.1 要点一:首先会按行键排序
5.2 要点二:同一行里面的kv会按列簇排序,再按k排序
- hbase中只支持byte[]
- 此处的byte[] 包括了: rowkey,key,value,列簇名,表名
- HBase基于hadoop : HBase的存储依赖于HDFS
文章图片
HBASE的表结构图示
文章图片
HBASE工作机制图示
文章图片
组件说明
- Client : hbase客户端
1.包含访问hbase的接口。比如,linux shell,java api。
2.除此之外,它会维护缓存来加速访问hbase的速度。比如region的位置信息。
- Zookeeper :
1.监控Hmaster的状态,保证有且仅有一个活跃的Hmaster。达到高可用。
2.它可以存储所有region的寻址入口。如:root表在哪一台服务器上。
3.实时监控HregionServer的状态,感知HRegionServer的上下线信息,并实时通知给Hmaster。
4.存储hbase的部分元数据。
- HMaster :
1.为HRegionServer分配Region(新建表等)。
2.负责HRegionServer的负载均 衡。
3.负责Region的重新分配(HRegionServer宕机之后的Region分配,HRegion裂变:当Region过大之后的拆分)。
4.Hdfs上的垃圾回收。
5.处理schema的更新请求
- HRegionServer :
1.维护HMaster分配给的Region(管理本机的Region)。
2.处理client对这 些region的读写请求,并和HDFS进行交互。
3.负责切分在运行过程中组件变大的Region。
- HLog :
对HBase的操作进行记录,使用WAL写数据,优先写入log(put操作:先写日志再写 memstore,这样可以防止数据丢失,即使丢失也可以回滚)。
- HRegion :
HBase中分布式存储和负载均衡的最小单元,它是表或者表的一部分。
- Store :
相当于一个列簇
- Memstore :
内存缓冲区,用于将数据批量刷新到hdfs中,默认大小为128M
- HStoreFile :
和HFile概念意义,不过是一个逻辑概念。HBase中的数据是以HFile存储在Hdfs 上。组件之间的关系
hmaster:hregionserver=1:*【大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》】
hregionserver:hregion=1:*
hregionserver:hlog=1:1
hregion:hstore=1:*
store:memstore=1:1
store:storefile=1:*
storefile:hfile=1:1
文章图片
四、HBASE的rowKey设计原则与热点问题的解决(面试常问) 1 设计原则
是由于行键相似、连续数据量过大造成单region的数据量过大,进而影响读写效率
行键应该尽量的随机、不要出现连续行键。(RegionServer1:rk0001,rk2002,rk30003; RegionServer2: rk0002,xx )
常见的行键设计就是,比如手机号码倒置+时间戳,比如随机前缀+关系型数据库中的主键(以存放在mr中电信日志案例为例)hbase的行键设计三原则
唯一原则:
必须在设计上保证其唯一性。由于在HBase中数据存储是Key-Value形式,若HBase中同一表插入相同Rowkey,则原先的数据会被覆盖
长度原则
Rowkey长度设计原则:Rowkey是一个二进制,Rowkey的长度被很多开发者建议说设计在10~100个字节,建议是越短越好。
原因有两点: 其一是HBase的持久化文件HFile是按照KeyValue存储的,如果Rowkey过长比如500个字节,1000万列数据光Rowkey就要占用 500*1000万=50亿个字节, 将近1G数据,这会极大影响HFile的存储效率
散列原则
我们设计的Rowkey应均匀的分布在各个HBase节点上,rowkey不均匀可能造成RegionServer访问压力过大造宕机
时间戳举例,假如Rowkey是按系统时间戳的方式递增,Rowkey的第一部分如果是时间戳信息的话将造成所有新数据都在一个RegionServer上堆积的热点现象,也就是通常说的Region热点问题, 热点发生在大量的client直接访问集中在个别RegionServer上(访问可能是读,写或者其他操作),导致单个RegionServer机器自身负载过高, 引起 性能下降甚至Region不可用,常见的是发生jvm full gc或者显示region too busy异常情况,当然这也会影响同一个RegionServer上的其他Region。
列簇的设计原则
- 列簇尽量少,最好不超过3个。因为每个列簇是存在一个独立的HFile里的,flush和compaction操作都是针对一个Region进行的,当一个列簇的数据很多需要flush的时候,其它列簇即使数据很少也需要flush,这样就产生的大量不必要的io操作。
- 在多列簇的情况下,注意各列簇数据的数量级要一致。如果两个列簇的数量级相差太大,会使数量级少的列簇的数据扫描效率低下。
- 将经常查询和不经常查询的数据放到不同的列簇。
因为列簇和列的名字会存在HBase的每个Cell中,所以他们的名字应该尽可能的短。比如,用f:q代替mycolumnfamily:mycolumnqualifier
- 避免使用递增的数字或时间做为rowkey。
- 如果rowkey是整型,用二进制的方式比用string来存储更节约空间
- 合理的控制rowkey的长度,尽可能短,因为rowkey的数据也会存在每个Cell中。
- 如果需要将表预分裂为多个region是,最好自定义分裂的规则。
1.Reverse反转
针对固定长度的Rowkey反转后存储,这样可以使Rowkey中经常改变的部分放在最前面,可以有效的随机Rowkey。
2.Salt加盐
Salting是将每一个Rowkey加一个前缀,前缀使用一些随机字符,使得数据分散在多个不同的Region,达到Region负载均衡的目标
3.Hash散列或者Mod
用Hash散列来替代随机Salt前缀的好处是能让一个给定的行有相同的前缀,这在分散了Region负载的同时,使读操作也能够推断。
实际应用场景是当数据量越来越大的时候,这种设计会使得分区之间更加均衡。
小结
rowkey:行键,和mysql的主键同理,不允许重复。
columnfamily: 列簇,列的集合之意。
column:列
timestamp:时间戳,默认显示最新的时间戳,可用于控制k对应的多个版本值,默认查最新的数据 version:版本号,表示记录数据的版本
cell:单元格,kv就是cell
模式:无有收获?希望烙铁们来个三连击,让更多的同学看到这篇文章
数据类型:只存储byte[]
多版本:每个值都可以有多个版本
列式存储:一个列簇存储到一个目录
稀疏存储:如果一个kv为null,不占用存储空间
1、烙铁们,关注我看完保证有所收获,不信你打我。
2、点个赞呗,可以让更多的人看到这篇文章,后续还会有很哇塞的产出。
本文章仅供学习及个人复习使用,如需转载请标明转载出处,如有错漏欢迎指出
务必注明来源(注明: 来源:csdn , 作者:-马什么梅-)
推荐阅读
- 我要做大厨
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 知识
- 三十年后的广场舞大爷
- 奔向你的城市
- 村里的故事|村里的故事 --赵大头
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 汇讲-勇于突破