hbase特点
- 高可靠
- 高性能
- 面向列
- 可伸缩
- 实时读写
hbase数据量:十亿级别的行、百万级别的列
hbase速度快的原因:
- 因为它充分利用了内存,优先往内存中写,之后的溢写合并就不再关客户端的事,客户端只负责将数据写到内存中,所以它的速度比较快。
- 使用了LSM树
- 缓存机制(写缓存、读缓存)
- 文件是顺序读写(并非随机读写,不需要磁道的移动寻址时间)(使用get获取数据时,get的底层也是通过scan得到的)
hbase数据模型
- rowkey
- 相当于mysql的主键,唯一标识一行记录
- 按字典序排序
- rowkey的长度最长是64k,但一般推荐10-100字节
- column family列族
- 一组列的集合。一个列族可以包含n多个列,由列名标识
- 列族必须作为表的schema(定义的一个规则,这个列族名字叫什麽,里面包含哪些属性)
- 列族是权限、存储的最小单元,是可操作的最小粒度。位于同一个列族下面的所有列共享相同的权限属性。
- qulifier 列
- 可以动态的,随机的插入
- 表定义之后没有限制列,随着值的插入也把列插入
- 列必须归属于某一个列族
- timestamp 时间戳
- 64位整数,精度是毫秒
- 起版本号的作用,一个cell中可以存在多版本的数据
- 时间戳可以自己定义但是一般不推荐
- cell
- 存储数据的最小单元(逻辑上的概念,真实物理上有多少列对应多少行)
- 存储的是KV格式的数据:K=row key+column family+qulifier+timestamp V=value
- hbase的cell存储数据的时候没有类型之分,存储的都是字节数组
hbase架构:主从架构
- 角色
-
client
- 1.操作hbase的接口:
- a. 命令行
- b. java api
- HBaseAdmin 管理表
- createtable
- disabletable
- deletetable
- HTable 管理数据
- 添加数据 put
- 获取数据 get \ scan
- 删除数据 delete
- HBaseAdmin 管理表
- 2.并维护客户端的缓存
- 1.操作hbase的接口:
-
zookeeper:高可用+存储元数据的元数据
- 保证任何时刻集群中只有一台active的master
- 存储所有region的寻址入口:指的是所有region的元数据存储在哪一台regionserver中,默认放在hbase这个命名空间下的meta目录中,也存储于hdfs中 /hbase/data/hbase/meta
- 监控regionserver的上线和下线信息,并实时通知master
- 存储相关的表的数据(表的名称等)
- ls /hbase
[replication, meta-region-server, rs, splitWAL, backup-masters, table-lock, region-in-transition, online-snapshot, master, running, recovering-regions, draining, namespace, hbaseid, table]
[zk: localhost:2181(CONNECTED) 10] ls /hbase/table
[hbase:meta, psn, hbase:namespace, phone]
命名空间:表名称,没有带命名空间的默认为default
- ls /hbase
-
master
- 掌握所有regionserver的使用情况,为其分配region
- 保证整个集群中所有regionserver中的负载均衡
- 当发现某一台regionserver宕机之后,重新分配上面的region
- 当region变大发生裂变之后,master负责去分配region到哪一台regionserver中
-
regionserver
- 负责接收客户端的读写请求,处理对于region的io
- 当某一个region变大之后,regionserver负责等分该region为两个region。regionserver负责切,master负责分配
-
region
- 相当于表的概念
- 一张表至少对于一个region
- 当表的数据过大的时候,region会发生等分裂变(由regionserver分,由master分配)
-
store(逻辑上)
- 相当于列族
- store中有memstore和storefile
- memstore位于内存,每一个store有一个memestore
- storefile是磁盘存储空间,将数据持久化存储的位置
- 每一个region有一个或多个storefile
- storefile数量过多会进行合并操作(默认数量为3)
- 存储结构:使用了LSM树的数据模型
-
WAL
- write ahead log预写日志hlog
- 防止数据丢失
- 先写内存,再向hdfs上溢写,但是是异步的方式
-
读写流程
- 读流程:
- 客户端向zk中发送请求
- 从zk中拿到metadata的存储节点
- 去存储metadata的节点获取对应的region所在的位置
- 访问对应的region拿到数据
- 先去memstore查询,如果有结果直接返回
- 如果没有结果,再去blockcache中查找,如果找到直接返回
- 如果没有再去storefile中查找数据,并将查询到的结果返回到blockcache中方便下一次查询
- 将结果返回到客户端
- 注意:blockcache是缓存,有大小限制,会有淘汰机制,默认将最早进来的数据淘汰
- 写流程
- 客户端向zk发送请求
- 从zk中拿到metadata的存储节点
- 去存储meta的节点获取对应region所在的位置
- 访问对应的region,写数据
- 首先会向hlog中写数据,写成功之后才会向memstore中写数据
- 当memstore的数据量达到阈值之后会发生溢写,溢写成storefile
- storefile是一个个的小文件,会进行合并(合并的两种方式:minor,major)
- storefile是对hfile 的封装,hfile是实际存储在hdfs上的数据文件
- 读流程:
-