大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》


文章目录

  • 前言:
  • 一、 HBASE来源
  • 二、 HBASE介绍
    • HBase定义
    • HBase特性
    • HBASE与RDBMS和NOSQL区别
    • HBASE应用场景
  • 三 HBASE表模型
    • HBASE表模型的要点
    • HBASE的表中能存储数据类型
    • HBASE表的物理存储结构
    • HBASE工作机制图示
    • 组件说明
  • 四、HBASE的rowKey设计原则与热点问题的解决(面试常问)
    • 1 设计原则
      • hbase的行键设计三原则
      • 列簇的设计原则
      • rowkey的设计原则
    • 2 热点问题
      • 通常有3种办法来解决这个Region热点问题:

前言:
第一次带女友回家,妈妈好像特别喜欢女友,晚饭后留她在我家住
我小声说道:妈,这样不好吧?我们还没到那步呀!
妈妈笑道:想什么呢,你身材好又那么漂亮,我不愁你娶不到媳妇,我等会想叫你弟弟来认识认识,这小姑娘人不错。。。
大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章图片

一、 HBASE来源
  1. hbase是一个开源的、分布式的、多版本的、可扩展的、非关系型的数据库。
  2. hbase是big table的开源的java版本,建立在hdfs基础之上,提供高可靠性、高性能的、列式存储、可伸缩、近实时读写的nosql的数据库系统
  3. 数据量越来越大,传统的关系型数据库不能满足存储和查询的需求。而hive虽然能够满足存储的要求,但是hive的本质也是利用底层的mr程序,所以读写速度不快。而且hive不能满足非结构化的、半结构化的存储,hive的主要作用是做分析和统计,hive用于存储是无意义的。
二、 HBASE介绍 HBase定义
HBASE是一个数据库----可以提供数据的实时随机读写
HBASE与mysql、oralce、db2、sqlserver等关系型数据库不同,它是一个NoSQL数据库(非关系型数据库)
大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章图片

HBase特性 Hbase的表模型与关系型数据库的表模型不同:
  • Hbase的表没有固定的字段定义;
  • Hbase的表中每行存储的都是一些key-value对
  • Hbase的表中有列簇的划分,用户可以指定将哪些kv插入哪个列族
  • Hbase的表在物理存储上,是按照列簇来分割的,不同列簇的数据一定存储在不同的文件中
  • Hbase的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复
  • Hbase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,hbase不负责为用户维护数据类型
  • HBASE对事务的支持很差
大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章图片

HBASE与RDBMS和NOSQL区别
HBase的表数据存储在HDFS文件系统中。 从而,hbase具备如下特性:存储容量可以线性扩展; 数据存储的安全性可靠性极高!
  • hbase的表模型跟mysql之类的关系型数据库的表模型差别巨大
  • hbase的表模型中有:行的概念;但没有字段的概念
  • 行中存的都是key-value对,每行中的key-value对中的key可以是各种各样,每行中的key-value对 的数量也可以是各种各样
HBASE应用场景 大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章图片

三 HBASE表模型 HBASE表模型的要点
  1. 一个表可以分为多个列簇(不同列簇的数据会存储在不同文件中)
  2. 表中的每一行有一个“行键rowkey”,而且行键在表中不能重复 4、表中的每一对kv数据称作一个cell
  3. hbase可以对数据存储多个历史版本(历史版本数量可配置)
  4. 整张表由于数据量过大,会被横向切分成若干个region(用rowkey范围标识),不同region的数据也 存储在不同文件中
  5. hbase会对插入的数据按顺序存储:
5.1 要点一:首先会按行键排序
5.2 要点二:同一行里面的kv会按列簇排序,再按k排序
HBASE的表中能存储数据类型
  • hbase中只支持byte[]
  • 此处的byte[] 包括了: rowkey,key,value,列簇名,表名
  • HBase基于hadoop : HBase的存储依赖于HDFS
HBASE表的物理存储结构 大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章图片
HBASE的表结构图示
大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章图片

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:*
hregionserver:hregion=1:*
hregionserver:hlog=1:1
hregion:hstore=1:*
store:memstore=1:1
store:storefile=1:*
storefile:hfile=1:1
【大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》】大数据|??只要你认真看完一千字??Hbase运行原理和结构??分分钟钟都吊打面试官《??记得收藏??》
文章图片

四、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。
列簇的设计原则
  1. 列簇尽量少,最好不超过3个。因为每个列簇是存在一个独立的HFile里的,flush和compaction操作都是针对一个Region进行的,当一个列簇的数据很多需要flush的时候,其它列簇即使数据很少也需要flush,这样就产生的大量不必要的io操作。
  2. 在多列簇的情况下,注意各列簇数据的数量级要一致。如果两个列簇的数量级相差太大,会使数量级少的列簇的数据扫描效率低下。
  3. 将经常查询和不经常查询的数据放到不同的列簇。
    因为列簇和列的名字会存在HBase的每个Cell中,所以他们的名字应该尽可能的短。比如,用f:q代替mycolumnfamily:mycolumnqualifier
rowkey的设计原则
  1. 避免使用递增的数字或时间做为rowkey。
  2. 如果rowkey是整型,用二进制的方式比用string来存储更节约空间
  3. 合理的控制rowkey的长度,尽可能短,因为rowkey的数据也会存在每个Cell中。
  4. 如果需要将表预分裂为多个region是,最好自定义分裂的规则。
2 热点问题 通常有3种办法来解决这个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 , 作者:-马什么梅-)

    推荐阅读