HBase是一个开源的,分布式的,多版本的,面向列的存储模型。
面向列:简单来说,就是指在存储数据库中的数据时,以列为单位来存储,把一列的数据串在一起存储起来,而非把一行的数据作为一个单元存储起来。
HBase的特点:
- HBase是构建在HDFS上的列式存储系统
- 基于Google的BigTable模型开发,典型的key/value系统
- 逻辑上,HBase将数据按照表,行和列进行存储
- HBase主要靠横向的扩展,通过不断地增加廉价的商用服务器来增加计算和存储能力。
HBase表的特点
- 大:一个表可以有十几亿行,上百万列
- 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,而同一张表中不同的行可以有截然不同的列
- 面向列:面向列的存储和权限控制,列独立的检索
- 稀疏:空(null)列不占用存储空间,可以设计的非常稀疏
- 数据多版本:每个单元的数据有多个版本,自动的分配版本号
- 类型单一:一切都是字符串,无其他类型
HBase的体系结构
HBase服务器体系结构遵从简单的主从服务器架构,由HRegion服务器集群和HMaster服务器构成。
HRegion
当表大小超过设置值,会自动分配不同的域,称为HRegion
HRegion服务器
一般一台机器上面只运行一个HRegion服务器,每一个区段的HRegion只会被一个HRegion服务器维护
HRegion服务器主要由两大部分:HLOG部分和HRegion部分。HLOG用来存储数据日志,采用的是先写日志的方式,即数据来的时候,先会记录进日志里面,后才存入HRegion中。HRegion服务器由多个HRegion组成,而HRegion则是由多个store组成,一个store存储的是同一列族下的数据。每个HRegion都有一个Memstore,作为数据缓冲,当数据发送来的时候,会先写入 Memstore中,等到缓冲区满了之后,再更新到对应的storefile中,store中包含多个storefile,storefile负责实际数据的存储,为HBase的最小单元。
HBase Master服务器
每台HRegion服务器都会与HMaster服务器进行通讯,而HMaster的主要任务就是告诉每个HRegion服务器它需要维护的HRegion。
HMaster主要负责Table和HRegion的管理工作,具体包括:
- 管理用户对Table的增删改查
- HRegion服务器的负载均衡,调整HRegion的分布
- HRegion分裂后,负责新的HRegion的分配
- HRegion服务器停机后,负责实效的HRegion服务器上HRegion的迁移
ROOT表和META表
保存元数据的表,我们称之为META表,随着元数据的增长,META表会被分割成几个HRegion,为定位这些HRegion,需要一个表,这个表就称之为ROOT表,ROOT表不能被分割,永远只存在一个,且名称固定。
ZooKeeper
ZooKeeper集群是协调系统,存储的为HBase中ROOT表和META表的位置,并负责监控机器状态,当HMaster出故障后,ZooKpeer负责HMaster的恢复工作。
HBase的常用命令
以一个例子来展示HBase常用操作
Person 表内容如下:
- 列出当前都有哪些表
$ show
2. 创建表
$ create <table name>,<column family>,...
$ create 'person','private data','public data'
3. 显示表的详细信息
$ desc/describe <table name>
$ desc 'person'
4. 插入数据
$ put <table name>,<row name>,<colfamily : colname>,<value>
$ put 'person','1','private data:age','25'
$ put 'person','1','private data:birthday','08-05'
$ put 'person','1','public data:name','xiaoming'
$ put 'person','1','public data:sex','man'
$ put 'person','2','private data:age','23'
$ put 'person','2','private data:birthday','04-20'
$ put 'person','2','public data:name','limei'
$ put 'person','2','public data:sex','woman'
5. 更新数据
同插入数据,直接覆盖原值就可以
6. 显示已存在的数据
$ get <table name>,<row name>
$ get 'person','1'
$ get 'person','2'
7. 删除数据
$ delete <table name>,'row name',<colfamily : colname>,timestamp
$ delete all <table name>,'row name'
$ delete 'person','1','public data:name', 1501940429288
$ delete all 'person','1'
8. 删除表
$ disable <table name> # 先禁用表
$ drop <table name>
$ disable 'person'
$ drop 'person'