目录
一、概念及架构
1、概念:
HBase的原型是Google的BigTable论文,用于支持结构化的数据存储。
Hbase是在HDFS上开发的面向列的分布式非关系型数据库,可以实时的随机访问超大规模数据集。
Hbase解决了可伸缩性的问题。它自底向上构建,能够简单的增加节点来达到线性扩展。hbase并不是关系型数据库,不支持sql,但在特定的问题空间里,它能够做RDBMS(关系数据库管理系统;)不能做到的事:在廉价硬件构成的集群上管理超大规模的稀疏表。
2、架构
HBase内置有zookeeper,但一般我们会有其他的Zookeeper集群来监管master和regionserver,Zookeeper通过选举,保证任何时候,集群中只有一个活跃的HMaster,HMaster与HRegionServer 启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase 管理ZooKeeper 实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了Active HMaster的负担。
一个RegionServer可以包含多个HRegion,每个RegionServer维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DatNode数量一致,请参考如下架构图:
二、RDBMS与HBase的对比
1、关系型数据库:
结构 | 功能 |
数据库以表的形式存在 | 支持向上扩展 |
支持FAT、NTFS、EXT、文件系统 | 使用SQL查询 |
使用Commit log存储日志 | 面向行,即每一行都是一个连续单元 |
参考系统是坐标系统 | 数据总量依赖于服务器配置 |
使用主键(PK)、支持分区 | 具有ACID支持、适合结构化数据 |
使用行、列、单元格 | 支持事务、支持Join |
2、Hbase
结构 | 功能 |
数据库以region的形式存在 | 支持向外扩展 |
支持HDFS文件系统 | 使用API和MapReduce来访问HBase表数据 |
使用WAL(Write-Ahead Logs)存储日志 | 面向列,即每一列都是一个连续的单元 |
参考系统是Zookeeper | 数据总量不依赖具体某台机器,而取决于机器数量 |
使用行键(row key) | HBase不支持ACID(Atomicity、Consistency、Isolation、Durability) |
支持分片 | 适合结构化数据和非结构化数据 |
使用行、列、列族和单元格 | 分布式的,不支持事务,不支持Join |
三、HBase特征简要、定位
1、自动故障处理和负载均衡
HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据的恢复也可以得到保障。另外,HMaster和RegionServer也是多副本的。
2、自动分区
HBase表是由分布在多个RegionServer中的region组成的,这些RegionServer又分布在不同的DataNode上,如果一个region增长到了一个阈值,为了负载均衡和减少IO,HBase可以自动或手动干预的将region切分为更小的region,也称之为subregion。
3、实时随机大数据访问
HBase采用log-structured merge-tree作为内部数据存储架构,这种架构会周期性地将小文件合并成大文件以减少磁盘访问同时减少NameNode压力。
4、横向扩展
HBase支持横向扩展,这就意味着如果现有服务器硬件性能出现瓶颈,不需要停掉现有集群提升硬件配置,而只需要在现有的正在运行的集群中添加新的机器节点即可,而且新的RegionServer一旦建立完毕,集群会开始重新调整。
5、HBase在集群中的定位
HBase一种是作为存储的分布式文件系统,另一种是作为数据处理模型的MR框架。因为日常开发人员比较熟练的是结构化的数据进行处理,但是在HDFS直接存储的文件往往不具有结构化,所以催生出了HBase在HDFS上的操作。如果需要查询数据,只需要通过键值便可以成功访问。
四、HBase的环境角色
1、HMaster:
监控RegionServer,处理RegionServer故障转移、元数据的变更、region的分配或移除,在空闲时间进行数据的负载均衡,通过Zookeeper发布自己的位置给客户端
2、RegionServer:
存储HBase的实际数据,处理分配给它的Region,刷新缓存到HDFS,维护HLog,负责处理Region分片,执行压缩
3、内含组件
Write-Ahead logs(WAL):预写日志系统,当对HBase读写数据,不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。如果机器突然爆炸,把数据保存在内存中会引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
HFile:这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
Store:HFile存储在Store中,一个Store对应HBase表中的一个列族
MemStore:顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
Region:Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region
五、启动Hbase
需要先启动hdfs和zookeeper
[root@hdp-1 bin]# bin/hbase-daemon.sh start master
[root@hdp-1 bin]# bin/hbase-daemon.sh start regionserver
或者:
[root@hdp-1 bin]# bin/start-hbase.sh
对应的停止命令:
[root@hdp-1 bin]# bin/stop-hbase.sh
浏览器输入 http://hdp-1:60010/ 可以访问管理页面
1、hbase客户端命令操作
[root@hdp-1 conf]# hbase shell
hbase(main):001:0>
2、查看当前数据库中有哪些表
hbase(main):001:0> list
=> ["student"]
3、创建一张表
# hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
hbase(main):001:0> create 'teacher','infos'
4、产看表信息
hbase(main):007:0> scan 'student'
5、插入信息
put 'teacher','001','infos:name','xin'
put 'teacher','001','infos:age','22'
put 'teacher','002','infos:name','wang'
6、查看表结构
describe 'teacher' 或者 desc 'teacher'
7、指定字段更新信息(和插入一样,覆盖原信息)
hbase(main):011:0> put 'teacher','001','infos:age','30'
8、查看指定行数据
hbase(main):013:0> get 'teacher','001'
查看指定行指定列或列族的数据:
get 'teacher','001','info:name'
9、删除数据
(1)删除指定行数据(指定rowkey)
hbase(main):023:0> deleteall 'teacher','001'
(2)删除掉某个rowKey中某一列的数据
hbase(main):025:0> delete 'teacher','002','infos:age'
(3)清空表数据
hbase(main):027:0> truncate 'teacher'
(4)直接删除表
首先需要先让该表为disable状态,使用命令:
hbase(main):029:0> disable 'teacher'
然后才能drop这个表,使用命令:
hbase(main):030:0> drop 'teacher'
10、统计一共多少行(一个rowkey算一行)
hbase(main):043:0> count 'teacher'
2 row(s) in 0.0250 seconds
=> 2
11、修改表定义(列名)
hbase(main):045:0> alert 'teacher','xinxi'
六、配置高可用
高可用是指另外配置一个HMaster,以备主HMaster不时之需,在hbase集群没有启动状态下:
1、conf目录下创建backup-masters文件
$ touch conf/backup-masters
2、在backup-masters文件中配置高可用HMaster节点
$ echo hdp-2 > conf/backup-masters
3、将整个conf目录scp到其他节点
$ scp -r conf/hdp-2:$PWD
在网页可以看到: