一、介绍
1.hbase是一个高纬度,面向列,高性能,高可靠的分布式实时数据库
2.hbase是一个nosql数据库,可以存储结构化,半结构化,非结构化的数据
二、数据模型
高维数据库,4个维度确定一个单元格
数据存储的格式是字节数组
1.rowkey
唯一确定一行数据
最多64kb
按字典排序
2.列族
创建表的时候定义
一个列族可以有多个列
一个列族的数据放到同一个目录下
3.列名
动态添加
每一行的列的个数和名称可以不同
4.版本号
一般用时间戳来充当版本号
默认是降序排序的,自动获取最新版本
每个单元格可以有多个版本
三、架构
1.zookeeper
监控regionserver的上下线信息,通知master
存储region的寻址入口(表的增删改查等dml操作不通过master来操作)
保存hbase的元数据信息
保证集群中只有一个可用的master
2.master
若发现失效的regionserver(由zookeeper告知),会移动这台regionserver的region到其他机器上
master管理表的创建,删除,修改、重命名等ddl操作
负责集群的负载均衡
给regionserver分配region
3.regionserver
切分过大的region
负责region的io读写请求
4.region
对应的是一张表中的一段连续的数据
默认一个region对应一张表
随着表的数据越来越多,region分裂成2个,后面会不断分裂
5.hlog
存放操作日志,数据存放是首先将操作日志放入hlog中,保证以后regionserver失效时,hbase能将其恢复
6.store
一个store中由一个memstore和0-多个storefile
一个store对应一个列族
7.memstore和storefile
数据存放的时候首先会写入到memstore内存缓冲区中,达到memstore的阈值128M的时候会溢写到storefile中,最后storefile会以hfile的形式存入hdfs中
8.compact
小合并:挑一些文件比较小的进行合并,只挑一部分文件合并
大合并:将所有的storefile文件进行合并
在合并的时候会从磁盘层面删除数据
四、API
1.put
可以批量插入,List<Put>
2.get
可以批量获取,List<Get>
3.scan(重要)
把握rowkey时字典排序的原则
4.delete
删除数据的时候,只会标记一个删除状态的表示,并不会马上删除数据
五、过滤器
1.pagefilter
2.valuefilter
3.singlecolumnvaluefilter
4.keyonlyfilter
5.prefixfilter
六、protobuf
1.一个第三方插件,可以产生java类代码,里面由序列化和反序列化的方法
2.可以将多个字段的数据,合并成一个字段,然后通过序列化存储到hbase的一个字段中,节省磁盘空间
七、性能优化
1.预分区
提前分区,减少split分区对集群的性能影响
数据迁移
2.热点问题
由于rowkey设计不合理导致的客户端的读写请求只会访问小部分的region,其他大部分的region访问不到,负载不均衡
解决:重新设计rowkey,取反,取hash,取模
无论是hash还取反,都会打散数据,后期查询的时候就不能通过scan方法遍历数据
3.列族
一张表列族的个数一般不超过两个,当一个store中的memstore发生溢写的时候,相邻的memstore也会发生溢写,这样对集群的io消耗比较大
4.blockcache
查询数据的时候,首先查询memstore,在查询blockcache,最后查看storefile中的文件
当从磁盘文件查出数据后,就会放入到blockcache中
blockcache数据队列的三个级别:第一次查询到的数据会放入single,多次查询到的数据存放到multi中,除非手动指明某些数据放入到in-memory中,否者数据不会存放到这个级别中
5.compact
小合并:有多种因素决定,最少三个符合条件的文件,最多10个文件,文件不能太大,大于某个参数,合并的时候,优先选择创建时间比较早的文件
大合并:所有的文件都合并,io消耗大,默认7天,优化:关闭自动合并,改成手动合并