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个

  经常要查询的数据最好放在一个列族中,尽量减少跨列族的数据访问

  如果有多个列族,列族中的数据设计得应该比较均匀

 

posted @ 2018-11-30 15:59  丶Biu~  阅读(32)  评论(0)    收藏  举报