HBASE数据库
HBASE概述
概述
hbase是基于hadoop的数据库工具,源于GooGle发表的一片论文《Big Table》,后来由Apache开源实现
hbase是一种NoSql非关系型数据库
适合存储非结构化、半结构化的数据
适合存储稀疏的数据,空数据不占用空间
hbase的存储是面向列的
提供实时的增删改查功能,是一种真正的数据库
可以存储海量的数据,性能强大,可以实现千万条数据毫秒级别的查询,但是不能提供严格的事物控制,只能在行级别保证事物
总结:是一个高可靠性、高性能、可延伸的分布式存储系统,利用hbase技术可以在廉价的PC机器上搭建大规模的存储集群。hbase利用hdfs作为文件存储系统,利用MapReduce做运算处理,利用ZooKeeper做协调工具。
逻辑结构
hbase通过表实现数据存储,但是表和关系型数据库中的结构不同
hbase表结构:
Hbase表的元数据存放在ZooKeeper中
行键:RowKey,即hbase中表的主键,具有唯一性
访问hbase的三种方式:
单一行键查询;
一组行键查询;
全表扫描;
列族:Column Family
列族在hbase中是表的元数据之一,需要在建表的时候指定,不能后期添加,如若需要添加需啊哟alter表,一个列族包含一个或多个列
列:Column
在hbase中可以动态的添加列,不需要提前申明,不是表的元数据
单元格与时间戳:cell、timestamp
通过行键和列确定的一个存储单元,每个存储单元有多个数据版本,通过时间戳来分辨,由时间戳、row、cloumn确定出来的唯一存储单元为cell单元格
在habse中数据都以二进制的形式存储,不区分数据格式
所有空数据不占用空间
Hbase原理
Hbase的工作方式
1.Hbase的存储结构、region
Hbase表中数据是按照行键的字典顺序排序的
Hbase表中数据按行的方向切分为一个或多个region
在Hbase表中,最开始只有一个region,当region达到一定的阈值时,会分割为两个新的region,数据不停增加的过程中,一张表可能对应一个或多个region
region是Hbase分布式存储和负载均衡的最小单位,但不是最小的存储单位,Hbase存储的最小单位是store,一个store存储一个列族,region中store的数量取决于多少个列族

每个store由一个memstore和0个或多个storefile组成

strorefile相当于hdfs中hfile,是只能写入不能修改的,所以Hbase的更新其实是不断做数据的版本追加,而不是数据修改
Hbase的数据读写
写入
在进行Hbase数写入请求时,Hbase会首先将请求的操作记录日志,再修改内存(memstore),为了提升效率,修改内存后直接返回修改结果,不会等在修改完成后在返回
memstore的内存是有限的,当memstore达到一定的阈值时,会新建一个memstore,而旧的memstore会被一个单独的线程flush到storefile中,也就是hfile,最后清空旧的memstore并在ZooKeeper中记录本次redopoint的时间信息
因为在hfile中数据是不能修改,Hbase数据更新是不断追击数据版本,这样,就会造成垃圾数据的沉淀,垃圾数据过多时会浪费存储空间,所以在hfile达到一定数量的时候会进行合并,在这个合并的过程中,会完成数据的清洗,过滤掉垃圾数据,并
将多个storefile合并为一个大的storefile文件,当某个storefile文件达到一定阈值时,会将当前region进行split操作,由HMaster将分割出来的两个新的region分配到对应的RegionServer下
所以在store中数据是由memstore和storefile组成的,当遇到停电时,可能造成memstore中数据丢失,在重新启动Hbase后,Hbase会在ZooKeeper中查询该store上次进行redo point的时间,从hlog日志里面进行数据恢复,实现数据的高可靠性
hlog在每台regionserver上只有一份,其上的所有region都统一使用此日志,提升了读写效率
hlog也是在hdfs中分布式存储的,保证了日志文件的可靠性
读取
region寻址
在Hbase的的名称空间下存放了一张meta表,该表中记录了Hbase下所有数据表对应的region信息,以及region对应的regionserver
通过访问ZooKeeper下meta-region-server节点获取到meta表的region地址,访问该地址获取到meta表中的数据,在通过此表获取到需要的查询的region地址
上述region寻址过程是比较消耗时间的,所以在客户端获取到对应的region地址后,会进行缓存,方便下一次快速查询
读数据
通过上述region寻址找到相应的region地址后,连接到regionserver,找到相应的region
读取时,会先查找memstore是否有要读取的数据,若有则直接返回,若不存在,需要到对应的storefile中进行查找,在查找storefile的时候,并不是将所有的storefile恢复到内存中区查找,而是在storefile中读取trailer段,查找当前storef是否有要
查找的建,如果存在,则找到对应的datablock,返回到内存,当没有具体的数据版本要求时,会将所有版本数据返回到内存中进行合并,返回最新的数据
Hfile结构


Hbase架构
从HBase的架构图上可以看出,HBase中的存储包括HMaster、HRegionSever、HRegion、HLog、Store、MemStore、StoreFile、HFile等,以下是HBase存储架构图:

HMaster的作用:
1.为HRegionServer分配HRegion
2.负责HRegionServer的负载均衡
3.发现失效的HRegionServer并重新分配HRegion
4.HDFS上的垃圾文件回收
HRegionServer的作用:
1.维护HRegion,处理对这些HRegion的IO请求
2.负责切分过大的HRegion
从上述我们可以看到,其实HMaster需要负责的工作是很少的,客户端对HRegion上面的数据访问并不需要HMaster的参与,HMaster仅仅维护了Table与HRegion的元数据信息,负载很低
Hbase表基本操作与概念
Hbase表操作
启动
/bin/start-hbase.sh
进入Shell
bin/hbase shell
查询帮助文档命令
help
创建表单
create '表名','列族1','列族2',....
建表是可以指定VERSIONS,配置的是持久化保存时,需要保留数据的版本数量
create '表名',{NAME=>'列族1',VERSIONS=>3},{NAME=>'列族2',VERSIONS=>2}
查看所有表
list
添加数据
put '表名','行键','列族:列名','添加数据'
遍历表
scan '表名'
遍历时可以添加遍历范围
分页:scan '表名',{LIMIT=>2}#遍历前两条数据
设置开始行(Hbase表按行键字典顺序排序):scan '表名',{STARTROW=>‘行键’}#从此行键开始遍历
设置结束行(Hbase表按行键字典顺序排序):scan '表名',{STARTROW=>‘行键1’,ENDROW=‘行键2’}#从行键1开始遍历到行键2结束,注:遍历时包含行键1,不含有行键2,即 行键1 <= 数据 < 行键2,其中STARTROW和ENDROW必须大写
查询时可以使用RAW=>true开启历史版本查询,VERSIONS=>3来指定需要查询的最新的版本数量
scan '表名',{RAW=>ture,VERSIONS=>3}
查看表详情
describe '表名'
根据行键获取数据
get '表名','行键'
删除数据
delete '表名','行键','列族:列名'
删除表
1.置为无效表:disable '表名'
2.删除表:drop ' 表名'
Hbase表设计的概念
Hbase表的设计主要包含行键的设计、列族的设计
1.行键的设计
Hbase表中,行键等价于主键,具有唯一性,且在Hbase查询时只能根据行键进行查询,故一个好的行键直接影响到查询的效率
行键设计的基本原则:
行键必须唯一
必须唯一才能锁定数据
行键必须有意义
有意义后方便数据查询
行键最好是字符串类型
数据类型在不同系统中处理的方式可能不同
行键最好具有固定长度
长度不同可能造成字典排序时与预期的结果不同
行键不宜过长
行键最多可达64kb,但是最好在10~100字节之间,最好不要超过16字节,越短越好,最好是8字节的整倍数
行键的设计会影响到其表的排序结果,也就涉及到region的分布结果,要注意,设计行键时应该让经常查询的数据分散在不同的region中,防止某一个或某几个regionserver成为热点
可以将经常要查询的条件作为行键最前面的数据,这样一来可以方便批量查询
2.列族的设计
在设计Hbase表时,列族不宜过多,越少越好,官方给定的列族数最好不要超过3个
经常要查询的数据最好放在一个列族中,尽量减少跨列族的数据访问
如果有多个列族,列族中的数据设计得应该比较均匀

浙公网安备 33010602011771号