hbase
hbase是数据库
特点
高可靠性
高性能
面向列
可伸缩
实时读写
数据量
十亿级别的行
百万级别的列
速度快的原因
充分利用内存
使用了LSM树
缓存机制
文件是顺序读
数据模型
rowkey
相当于MySQL中的主键,唯一标识一行记录
rowkeys是字典序
rowkey的长度最长是64k,但是一般推荐10-100字节
column family
一组列的集合
列族必须作为表的schema定义给出
列族是权限,存储的最小单元
qulifier
列
可以动态的,随机的插入
表定义之后没有限制列,随着值的插入也把列插入
列必须归属于某一个列族
timestamp
时间戳,64为整数,精度是毫秒
起版本号的作用,一个Cell中可以存在多版本的数据
时间戳可以自己定义,但是一般不推荐
cell
存储数据的最小单元(逻辑概念)
存储的是KV格式的数据
K: rowkey+column family+qulifier+timestamp
V:value
hbase的cell存储数据的时候没有类型的区分,存放的都是字节数组
架构
hbase是主从架构
角色
client
操作hbase的接口,并维护客户端缓存
zookeeper
保证任何时刻集群中有且仅有一台avtive的master
存储所有region的寻址入口
所有region元数据存储在哪一台regionserver
监控regionserver的上线和下线信息,并实时通知master
存储相关的表的schema数据
master
分配region
保证整个集群中的所有regionserver的负载均衡
当发现某一台regionserver宕机之后,重新分配上面的region
当region变大进行裂变的时候,master去分配region到哪一台regionserver
regionserver
负责接受客户端的读写请求,处理对于region的IO
当某一个region变大之后,负责等分为两个region
region
相当于表的概念,一张表至少对应一个region
当表的数据过大的时候,region会发生裂变
store
相当于列族
角色
memstore
位于内存
每一个store有一个memstore
storefile
磁盘存储空间,将数据持久化的存储位置
每一个region有一个或者多个storefile
storefile可以进行合并操作
存储结构:使用了LSM的数据模型
读写流程
读流程
1、客户端向zk中发送请求
2、从zk中拿到metadata的存储节点
3、去存储metadata的节点获取对应region的所在位置
4、访问对应的region获取数据
5、先去memstore中查询数据,如果有结果,直接返回
6、如果没有查询到结果,去blockcache查找数据,如果找到,直接返回
7、如果没有找到,去storefile中查找数据,并将查询到的结果缓存会blockcache中,方便下一次查询
8、将结果返回给客户端
注意:blockcache是缓存,有大小限制,会有淘汰机制,默认将最早的数据淘汰
写流程
1、client向zk发送请求
2、从zk中拿到metadata的存储节点
3、去存储matadata的节点获取对应region所在的位置
4、访问对应的region写数据
5、首先会向wal中写数据,写成功之后才会存储到memstore
6、当memstore中的数据量达到阈值之后,进行溢写,溢写成storefile
7、store file是一个个的小文件,会进行合并(minor,major)
8、store file是对hfile的封装,hfile是实际存储再hdfs上的数据文件
WAL
write ahead log
放置数据丢失
先写内存,再向hdfs上溢写,但是是异步的方式
数据flush过程
1) 当MemStore数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog中的历史数据;
hbase.hregion.memstore.flush.size: 针对region级别,当一个region内的所有memstore总大小达到该阈值的时候,所有的memstore都会溢写到磁盘文件
hbase.regionserver.global.memstore.size:针对regionserver级别,当一个regionserver内的所有memstore总大小达到该阈值的时候,当前regionserver内的所有store的memstore全部flush
2)并将数据存储到HDFS中;
数据合并过程
1)当数据块达到4块(一个store中的Hfile),HMaster将数据块加载到本地,进行合并;
2)当合并的数据(store数据)超过256M,进行拆分,将拆分后的Region分配给不同的HregionServer管理(一个store列族数据超过256m会对整个region进行切分,此处可以预分区);
自动切分region;
3)当HregionServer宕机后,将HregionServer上的hlog拆分,然后分配给不同的HregionServer加载,修改.META.;
4)注意:HLog会同步到HDFS。(memstore在一个server上也会有很多,所以hlog丢失会不安全)
JAVAAPI
HBaseAdmin
管理表
createtable
disabletable
deletetable
HTable
管理数据
put
get
scan
delete
HBase优化
高可用(high available)
在HBase中HMaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果HMaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对HMaster的高可用配置。
RowKey设计
一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内,设计rowkey的主要目的 ,就是让数据均匀的分布于所有的region中,在一定程度上防止数据倾斜。接下来我们就谈一谈rowkey常用的设计方案。
注意:RowKey如何设计必须结合实际业务场景
预分区
每一个region维护着startRowKey与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高HBase性能。
注意:手动分区(预分区)需要对业务数据量有把控
内存优化
HBase操作过程中需要大量的内存开销,毕竟Table是可以缓存在内存中的,一般会分配整个可用内存的70%给HBase的Java堆。但是不建议分配非常大的堆内存,因为GC过程持续太久会导致RegionServer处于长期不可用状态,一般16~48G内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。