文章目录
- 读请求过程
- 写请求过程
- region的分配过程
- region server上线
- region server下线
- Hmaster的上线
- Hmaster下线后的影响
- flush机制
- HBase的基本介绍
- HBASE的适用场景
- Hbase和Hadoop之间的关系
- Hbase与RDBMS的关系
- Hbase详细架构
- Row Key
- 列族Column Family
- 时间戳
- hbase本身提供数据回收机制
- 什么是Cell
- 什么是VersionNum
- hbase物理存储
- region的切分
- Memstore与storefile
- HLog(WAL log)
- HBase的特征:
- compact机制
- split机制
- hbase预分区的优点
- rowKey的获取方式
- rowkey的长度原则
- rowkey散列原则
- 什么是热点问题
- 如何解决热点问题
读请求过程
- meta表是hbase系统自带的一个表。里面存储了hbase用户表的元信息。
- 元信息为meta表内记录一的行数据,是用户表一个region的start key 到endkey的范围。
- meta表存储在regionserver里。 具体存储在哪个regionserver里?zookeeper知道。
过程:
- 客户端到zookeeper询问meta表在哪
- 客户端到meta所在的节点(regionserver)读取meta表的数据
- 客户端找到region 获取region和regionserver的对应关系,直接到regionserver读取region数据
写请求过程
- Client先访问zookeeper,找到Meta表,并获取Meta表元数据。确定当前将要写入的数据所对应的HRegion和
HRegionServer服务器。 - Client向该HRegionServer服务器发起写入数据请求。
- Client先把数据写入到HLog,以防止数据丢失,然后将数据写入到Memstore。
- Memstore达到阈值,会把Memstore中的数据flush到Storefile中
- 当Storefile越来越多,达到一定数量时,会触发Compact合并操作,将多个小文件合并成一个大文件。
- Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,变成两个文件。
说明:hbasez 支持数据修改(伪修改),实际上是相同rowkey数据的添加。hbase只显示最后一次的添加
region的分配过程
前提:一个region只能分配给一个region server
- master记录了当前有哪些可用的region server。以及当前哪些region分配给了哪些region
server,哪些region还没有分配。 - 当需要分配的新的region,并且有一个region server上有可用空间时,master就给这个region
server发送一个装载请求,把region分配给这个region server。 - region server得到请求后,就开始对此region提供服务。
region server上线
前提:master使用zookeeper来跟踪region server状态。
- 当某个region server启动时,首先在zookeeper上的/hbase/rs目录下建立代表自己的znode。
- master订阅了/hbase/rs目录上的变更消息,当/hbase/rs目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此一旦region
server上线,master能马上得到消息
region server下线
前提:master使用zookeeper来跟踪region server状态。
- 当region server下线时,它和zookeeper的会话断开。
- zookeeper而自动释放代表这台server的文件上的独占锁(znode)
- zookeeper将变化发送给master
- master 将挂掉的region server的region分配给其它还活着的regionserver
Hmaster的上线
前提:hbase集群中可以设置多个Hmaster,真正对外提供服务的只有一个
- 从zookeeper上获取唯一 一个代表active master的锁,用来阻止其它master成为真正的master。
- 扫描zookeeper上的/hbase/rs节点,获得当前可用的region server列表。
- master和每个region server通信,获得当前已分配的region和region server的对应关系。
- master扫描.META.表,计算得到当前还未分配的region,将他们放入待分配region列表。
Hmaster下线后的影响
master只维护表和region的元数据,不参与表数据IO的过程,所以master下线短时间内对整个hbase集群没有影响。表的数据读写还可以正常进行。
- 无法创建删除表
- 无法修改表的schema
- 无法进行region server的负载均衡(对象region)
- 无法处理region server 上下线
- 无法进行storeFile的 合并(region的split可以正常进行)
当hmaster下线后,启动Zookeeper的选举机制,选出新的Hmaster,新的Hmaster上线,执行上线流程。
flush机制
- 全局的memstore的flush机制默认为堆总大小(多个memstore 多个region)的40%,超过该大小会触发flush到磁盘的操作,会阻塞客户端读写,flush将所有的memstore全部flush.
- 单个的memstore默认为
数据达到128M
或1h
或者数据为堆大小 0.95倍
将会flush. - memstore默认将会先提前flush 5M.(先flush一小部分,等后面数据达到阈值在flush后 面的数据) 这样会比一次flush效率高
hbase不建议配置过多列族:过多的列族会消耗大量的内存,同时数据在flush时消耗磁盘IO. 一个regionserver续写操作可用堆内存的80%,读取占用40% ,写入占用40%。这两个参数直接影响hbase读写性能。
HBase的基本介绍
- Hbase是建立在hdfs之上的一个数据库
- 支持的数据类型:byte[]
- 不支持join等SQL复杂操作
- 依靠横向扩展,一个表可以有上十亿行,上百万列
- 面向列(族)的存储和权限控制
- 对于为空(null)的列,并不占用存储空间,是一个稀疏表。
HBASE的适用场景
海量数据、精确查询、快速返回
- 海量数据:数据量的背景
- 精确查询:业务场景
- 快速返回:业务对时效性的要求
Hbase和Hadoop之间的关系
HDFS:
- 作用:海量数据存储
- 适合一次性扫描大量数据
- 适合一次写入多次读取
- 不适合频繁更新的数据
HBASE:
- 适用一次扫描少量数据
- 适合多次写入多次读取
- 支持数据更新和删除
Hbase与RDBMS的关系
RDBMS :
- 支持SQL查询
- 支持事务
- 支持Join
HBASE :
- 不支持SQL查询
- 不支持事务
- 不支持Join
Hbase详细架构
Client:
- 访问数据的入口,
- 包含访问hbase的API接口,
- 维护着一些cache来加快对hbase的访问
Zookeeper:
- zookeeper的选举机制保证任何时候,集群中只有一个master
- 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
- 存储Hbase的schema
- 存储所有Region的寻址入口
Master:
- 为Region server分配region
- 负责region server的负载均衡
- 发现失效的region server并重新分配其上的region
- 处理schema(元数据)更新请求
- Hmaster短时间下线,hbase集群依然可用,长时间不行。
Region server:
-
Region server维护Master分配给它的region,处理对这些region的IO请求
-
Region server负责切分在运行过程中变得过大的region
Row Key
- 最大长度是 64KB
- 完全可以自行设计
- Hbase会对表中的数据按照rowkey(字典序)排序
列族Column Family
- 列族是表的schema的一部分,而列不是。
- (schema包含表名和列族)
- 每个列都所属于某一个列族。
- 一个列族可以包含多个列。
- 一个列族与列的关系是一对多。
时间戳
- 时间戳标记一个数据的不同版本
- 时间戳可以由hbase在数据写入时自动 赋值
- hbase支持工程师自己定义时间戳
- 每个 cell中,不同版本的数据按照时间倒序排序
hbase本身提供数据回收机制
- 保存数据的最后n个版本
- 保存最近一段时间内的版本
什么是Cell
- 存储数据的最小单位
- 由{row key, column( = + ), version} 唯一确定的单元确定一个精确的数据
什么是VersionNum
- VersionNum是数据的版本号
- VersionNum的默认值为系统时间戳
hbase物理存储
- 一个regionserver内部可以有多个region,这多个region可能来自多个表或一个表
- 一个region只能属于一个regionserver.
- 一个regionserver只有一个HLog
- 一个region里面可以有多个store
- 一个store里面只有一个memstore与0个或多个storeFile
- storeFile的数据类型为HFile
region的切分
- region按大小分割(默认10G)
- 每个表一开始只有一个region,随着数据的增加,一个region逐渐变大,达到 10G,进行分裂,等分成两个region.
Memstore与storefile
- 一个region由多个store组成
- 每个store包含一个列族的所有数据
- Store包括位于内存的memstore和位于硬盘的 storefile
- 客户端检索数据时,先在memstore找,找不到再找storefile
HLog(WAL log)
每个Region Server维护一个Hlog,而不是每个Region对应一个Hlog.
Hlog的切分机制
- 当数据写入hlog以后,hbase发生异常。关闭当前的hlog文件
- 当日志的大小达到HDFS数据块的0.95倍的时候,关闭当前日志,生成新的日志
- 每隔一小时生成一个新的日志文件
HBase的特征:
- 海量存储
Hbase适合存储PB级别的海量数据,在几十到百毫秒内返回数据。
- 列式存储
列族理论上可以很多,但实际上建议不要超过6个
- 极易扩展
处理能力(RegionServer)的扩展,是基于存储的扩展(HDFS)
hbase在最初设计的时候就考虑了扩展性。
- 高并发
在并发的情况下,Hbase的单个IO延迟下降并不多
- 稀疏
在列数据为空的情况下,是不会占用存储空间的。
compact机制
- 默认3个小的storeFile文件达到三个,合并成大的Storefile文件
split机制
- 默认一个HFile达到10Gb的时候就会进行切分
hbase预分区的优点
- 增加数据读写效率:数据分布在多台regionserver节点
- 负载均衡,防止数据倾斜:当数据时离散的发送时,预分区可以解决数据倾斜
- 方便集群调度region: 分布在多个节点便于调度
- 优化Map数量
rowKey的获取方式
- 通过rowkey直接查找
- 通过startkey endkey 范围查找
- 全表扫描
rowkey的长度原则
- 最大64K,建议在保证业务需求的前提下越短越好,最好不要超过16个字节.
rowkey散列原则
- 建议将rowkey的高位(左边)作为散列字段, 低位(右边)放时间字段,这样将提高数据均衡分布在每个
RegionServer,以实现负载均衡的几率。
若不按照此原则:
- 让时间戳作为高位,数据将按照时间的顺序进行存储会引发热点问题
什么是热点问题
- 当有一点时间业务数据爆炸增长时,这个阶段的数据将存储在少数的节点上。
如何解决热点问题
原则:将分散的数据,放在rowkey的高位
- 哈希(随机数):将哈希值放在高位
- 反转:反转固定长度或者数字格式的数据(时间戳反转、手机号反转,订单号反转)
- 加盐:本质时是加随机数,并且放在高位。