HBase理论知识总结

本文详细介绍了HBase的基础知识,包括其与Hadoop的关系、与RDBMS的区别,以及HBase的特性和存储模型。重点阐述了HBase的读写过程、Region管理和重要机制,如flush、compact和split。同时,提到了预分区和rowkey设计策略,旨在解决大数据场景下的热点问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是HBase?

HBase是建立在HDFS上的一个数据库,不支持事务及Join等SQL复杂操作
支持的数据类型:byte[]
依靠横向扩展,一个表可以有上十亿行,上百万列
面向列(族)存储和权限控制
对于为null(空)的列,并不占用存储空间,是一个稀疏表

2、HBase适用场景

海量数据、精确查询、快速返回

3、HBase和Hadoop之间的关系

  • HDFS适合一次性扫描大量数据;HBase不适合一次性扫描大量数据。
  • HDFS适合一次写入多次读取;HBase适合多次写入多次读取
  • HDFS不适合频繁更新数据;HBase支持数据更新及修改

4、HBase与RDBMS(关系型数据库)的关系

RDBMS支持SQL查询、支持事务、支持Join;HBase不支持SQL查询、不支持事务、不支持Join

5、HBase特征

  • 海量存储
  • 列式存储
  • 极易扩展
  • 高并发
  • 稀疏

6、HBase基础架构

Client
访问数据的入口,包含访问HBaseAPI接口,维护cache加快对HBase的访问
Zookeeper

  1. zookeeper的选举机制保证在任何时候,集群中只有一个master
  2. 实时监控Region Server的状态,将RegionServer的上线下线信息实时通知给Master
  3. 存储HBase的Schema
  4. 存储所有Region的寻址入口

Master

  1. 为RegionServer分配Region
  2. 负责RegionServer的负载均衡
  3. 发现失效的RegionServer并重新分配其上的Region
  4. 处理Schema更新请求

RegionServer

  1. RegionServer维护Master分配的Region,处理这些Region的IO请求
  2. RegionServer负责切分在运行过程中过大的Region

7、HBase的表数据模型

RowKey:最大长度是64K,完全可以自行设计。HBase会对表中的数据按照字典序对rowkey排序
ColumnFamily:列族是表的Schema的一部分,而列不是。每个列都所属于一个列族,一个列族可以包含多个列
Column:列族下具体的列
TimeStamp:标记着一个数据的不同版本
Cell:存储数据的最小单位
VersionNum:数据的版本号,默认当前系统时间戳

8、HBase物理存储

Region切分
每个表一开始只有一个Region,随着数据的增加,一个Region逐渐变大,达到10G进行分裂等分为两个Region。Region是HBase中分布式存储和负载均衡的最小单元。

MemStore和StoreFile
一个Region由多个Store组成,每个Store包含一个列族的所有数据,Store包含位内存的MemStore和位于硬盘的StoreFile,客户端检索数据时,先在MemStore中找,找不到再找StoreFile

HLog:每个RegionServer维护一个HLog,而不是每个Region一个
HLog的切分机制

  1. 当数据写入HLog以后,HBase发生异常,关闭当前的HLog文件
  2. 当日志的大小达到HDFS数据块的0.95倍的时候,关闭当前日志,生成新的日志
  3. 每隔一个小时生成一个新的日志文件

9、读写过程

读取过程

  1. client先访问zookeeper获取meta表的位置信息
  2. client根据位置信息访问meta表所在节点
  3. 找到Region获取Region和RegionServer的对应关系,直接到RegionServer读取Region数据

写入过程
4. Client先访问Zookeeper,找到Meta表,并获取Meta表元数据。确定当前要写入的数据对应的HRegion和HRegionServer服务器。
5. Client向该RegionServer服务器发起写入数据的请求
a) Client先把数据写入到HLog,以防止数据丢失
b) 然后将数据写入到MemStore中
6. MemStore达到阈值,会把MemStore中的数据flush到Storefile中
7. 当Storefile越来越多,达到一定数量时,会触发Compact合并操作,将多个小文件合并成一个大文件。
8. Storefile越来越大,Region也越来越大,达到阈值后,会触发Split操作,将一个大的Region等分为两个Region

10、Region的管理

Region的分配过程
前提:一个Region只能分配给一个RegionServer

  1. Master记录了当前有 那些可用的RegionServer。以及当前那些Region分配给了那些RegionServer,哪些Regon还没有分配
  2. 当需要分配新的Region,并且有一个RegionServer上有可用空间时,Master就给RegionServer发送一个装载请求,把Region分配给这个RegionServer
  3. RegionServer得到请求后,开始对这个Region提供服务’

11、Region Server的上下线

前提:master使用zookeeper来跟踪region server状态
RegionServer的上线

  1. 当某个RegionServer启动时,首先在Zookeeper上的 /hbase/rs目录下建立代表自己的znode
  2. master订阅了/hbase/rs目录上的变更消息,当/hbase/rs目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此,一旦RegionServer上线,master能马上得到消息

Region Server的下线

  1. 当RegionServer下线时,它和zookeeper的会话断开
  2. zookeeper自动释放代表这台Server的文件上的独立锁(znode)
  3. zookeeper将变化发送给master
  4. master将挂掉的Region Server的Region分配给其他还活着的Region Server

12、HMaster的上下线

HMaster的上线
前提:hbase集群中可以设置多个Hmaster,真正对外提供服务的只有一个

  1. 从zookeeper上获取唯一一个代表active master的锁,用来阻止其他master成为master
  2. 扫描zookeeper上的/hbase/rs节点,获得当前可用的RegionServer列表
  3. master和每个RegionServer通信,获得当前已分配Region和RegionServer的对应关系
  4. master扫描.meta.表,计算当前得到还未分配的Region,将他们放入待分配Region列表

HMaster的下线
master只维护表和Region的元数据,不参与表数据IO的过程,所以master下线短时间内对整个hbase集群没有影响
HMaster下线后的影响
无法创建删除表,无法修改表的schema,无法进行RegionServer的负载均衡,无法进行storefile的合并(region的split可以正常进行)

当hmaster下线后,启动zookeeper的选举机制,选出新的hmaster,新的hmaster上线,执行上线流程

13、HBase的三个重要机制

flush机制

什么时候触发flush?

  • hbase.hregion.memstore.flush.size:默认:128M(单个region里memstore的缓存大小)
  • hbase.regionserver.optionalcacheflushinterval: 默认:1h
  • hbase.regionserver.global.memstore.size.lower.limit: 默认:堆大小 0.95倍
  • hbase.hregion.preclose.flush.size:默认为:5M 提前进行flush.(先flush一小部分,等后面数据达到阈值在flush后 面的数据) 好处:比一次flush效率高

compact机制

默认3个,小的storefile文件达到三个,合并成大的StoreFile文件

split机制

默认一个Region达到10G的时候,进行切分

14、HBase的预分区

Hbase预分区的好处(优点)

  • 增加数据读写效率
  • 负载均衡,防止数据倾斜
  • 方便集群容灾调度Region
  • 优化Map数量

15、HBase的rowkey设计技巧

rowkey属性:最大64K,按照字典序排序,支持自定义
HBase数据的获取方式

  1. 通过rowkey直接查找
  2. 通过startkey-endkey范围查找
  3. 全表扫描

rowkey长度原则
最大64K,建议越短越好(在保证业务需求的前提下),不要超过16个字节

rowkey散列原则
建议将rowkey的高位作为散列字段,低位放时间字段,这样能使数据尽量均衡分布在每个RegionServer,以实现负载均衡的几率

rowkey唯一原则
必须在设计上保证其唯一性,将经常读取的数据存储到一起,将最近可能会访问的数据放到一起

16、热点问题如何解决?

什么是热点问题?
是指在短时间内,数据量呈爆发性增长的情况被称为热点问题

如何解决?
原则:将分散的数据放在rowkey的高位

  • 哈希(随机数):将哈希值放在高位
  • 反转:反转固定长度或数字格式的数据(时间戳反转、手机号反转、订单号反转)
  • 加盐:本质是加随机数,并且放在高位

17、 hbase提供的两种数据版本回收方式:

  • 保存数据的最后n个版本
  • 保存最近一段时间内的版本(设置数据的生命周期TTL)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值