文章目录
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:
- zookeeper的选举机制保证在任何时候,集群中只有一个master
- 实时监控Region Server的状态,将RegionServer的上线下线信息实时通知给Master
- 存储HBase的Schema
- 存储所有Region的寻址入口
Master
- 为RegionServer分配Region
- 负责RegionServer的负载均衡
- 发现失效的RegionServer并重新分配其上的Region
- 处理Schema更新请求
RegionServer
- RegionServer维护Master分配的Region,处理这些Region的IO请求
- 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的切分机制:
- 当数据写入HLog以后,HBase发生异常,关闭当前的HLog文件
- 当日志的大小达到HDFS数据块的0.95倍的时候,关闭当前日志,生成新的日志
- 每隔一个小时生成一个新的日志文件
9、读写过程
读取过程:
- client先访问zookeeper获取meta表的位置信息
- client根据位置信息访问meta表所在节点
- 找到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
- Master记录了当前有 那些可用的RegionServer。以及当前那些Region分配给了那些RegionServer,哪些Regon还没有分配
- 当需要分配新的Region,并且有一个RegionServer上有可用空间时,Master就给RegionServer发送一个装载请求,把Region分配给这个RegionServer
- RegionServer得到请求后,开始对这个Region提供服务’
11、Region Server的上下线
前提:master使用zookeeper来跟踪region server状态
RegionServer的上线:
- 当某个RegionServer启动时,首先在Zookeeper上的 /hbase/rs目录下建立代表自己的znode
- master订阅了/hbase/rs目录上的变更消息,当/hbase/rs目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此,一旦RegionServer上线,master能马上得到消息
Region Server的下线:
- 当RegionServer下线时,它和zookeeper的会话断开
- zookeeper自动释放代表这台Server的文件上的独立锁(znode)
- zookeeper将变化发送给master
- master将挂掉的Region Server的Region分配给其他还活着的Region Server
12、HMaster的上下线
HMaster的上线:
前提:hbase集群中可以设置多个Hmaster,真正对外提供服务的只有一个
- 从zookeeper上获取唯一一个代表active master的锁,用来阻止其他master成为master
- 扫描zookeeper上的/hbase/rs节点,获得当前可用的RegionServer列表
- master和每个RegionServer通信,获得当前已分配Region和RegionServer的对应关系
- 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数据的获取方式:
- 通过rowkey直接查找
- 通过startkey-endkey范围查找
- 全表扫描
rowkey长度原则
最大64K,建议越短越好(在保证业务需求的前提下),不要超过16个字节
rowkey散列原则
建议将rowkey的高位作为散列字段,低位放时间字段,这样能使数据尽量均衡分布在每个RegionServer,以实现负载均衡的几率
rowkey唯一原则
必须在设计上保证其唯一性,将经常读取的数据存储到一起,将最近可能会访问的数据放到一起
16、热点问题如何解决?
什么是热点问题?
是指在短时间内,数据量呈爆发性增长的情况被称为热点问题
如何解决?
原则:将分散的数据放在rowkey的高位
- 哈希(随机数):将哈希值放在高位
- 反转:反转固定长度或数字格式的数据(时间戳反转、手机号反转、订单号反转)
- 加盐:本质是加随机数,并且放在高位
17、 hbase提供的两种数据版本回收方式:
- 保存数据的最后n个版本
- 保存最近一段时间内的版本(设置数据的生命周期TTL)。