一、HBASE基础概念
1.HBASE概念
HBASE是一个数据库----可以提供数据的实时随机读写。HBASE与mysql、oralce、db2、sqlserver等关系型数据库不同,它是一个NoSQL数据库(非关系型数据库)
2.HBase特性
- HBase的表模型与关系型数据库的表模型不同:
- HBase的表没有固定的字段定义;
- HBase的表中每行存储的都是一些key-value对
- HBase的表中有列簇的划分,用户可以指定将哪些kv插入哪个列族
- HBase的表在物理存储上,是按照列簇来分割的,不同列簇的数据一定存储在不同的文件中
- HBase的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复
- HBase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,HBase不负责为用 户维护数据类型
- HBase对事务的支持很差
3.HBASE与RDBMS和NOSQL区别
HBase的表数据存储在HDFS文件系统中。
从而,hbase具备如下特性:存储容量可以线性扩展; 数据存储的安全性可靠性极高!- hbase的表模型跟mysql之类的关系型数据库的表模型差别巨大- hbase的表模型中有:行的概念;但没有字段的概念 - 行中存的都是key-value对,每行中的key-value对中的key可以是各种各样,每行中的 key-value对的数量也可以是各种各样
4.Hbase表结构
二、HBASE工作机制
1.图示
2.组件说明
Client : hbase客户端
1.包含访问hbase的接口。比如,linux shell,java api。
2.除此之外,它会维护缓存来加速访问hbase的速度。比如region的位置信息。
Zookeeper :
1.监控Hmaster的状态,保证有且仅有一个活跃的Hmaster。达到高可用。
2.它可以存储所有region的寻址入口。如:root表在哪一台服务器上。
3. 实时监控 HregionServer的状态,感知HRegionServer的上下线信息,并实时通知给Hmaster。
4. 存 储hbase的部分元数据。
HMaster :
1.为HRegionServer分配Region(新建表等)。
2.负责HRegionServer的负 载均衡。
3.负责Region的重新分配(HRegionServer宕机之后的Region分配,HRegion裂 变:当Region过大之后的拆分)。
4.Hdfs上的垃圾回收。
5.处理schema的更新请求
HRegionServer :
1.维护HMaster分配给的Region(管理本机的Region)。
2.处理 client对这些region的读写请求,并和HDFS进行交互。
3.负责切分在运行过程中组件变大的 Region。
HLog :
对HBase的操作进行记录,使用WAL写数据,优先写入log(put操作:先写日 志再写memstore,这样可以防止数据丢失,即使丢失也可以回滚)。
HRegion :
HBase中分布式存储和负载均衡的最小单元,它是表或者表的一部分。
Store :
相当于一个列簇
Memstore :
内存缓冲区,用于将数据批量刷新到hdfs中,默认大小为128M
HStoreFile :
不过是一个逻辑概念。HBase中的数据是以HFile存储在Hdfs上。
三、HBASE 操作
1. Namespace操作
1. list_namespace:查询所有命名空间
hbase(main):008:0> list_namespace
NAMESPACE
default
hbase
2. list_namespace_tables : 查询指定命名空间的表
hbase(main):014:0> list_namespace_tables 'hbase'
TABLE
meta
namespace
3.create_namespace : 创建指定的命名空间
hbase(main):018:0> create_namespace 'ns1'
hbase(main):019:0> list_namespace
NAMESPACE
default
hbase
ns1
4.describe_namespace : 查询指定命名空间的结构
hbase(main):021:0> describe_namespace 'ns1'
DESCRIPTION
{NAME => 'ns1'}
5. alter_namespace :修改命名空间的结构
hbase(main):022:0> alter_namespace 'ns1', {METHOD => 'set', 'name' => 'lixi'}hbase(main):023:0> describe_namespace 'ns1'
DESCRIPTION
{NAME => 'ns1', name => 'lixi'} hbase(main):022:0> alter_namespace 'ns1', {METHOD => 'unset', NAME => 'name'}
hbase(main):023:0> describe_namespace 'ns1'
6.删除命名空间
hbase(main):026:0> drop_namespace 'ns1' hbase(main):027:0> list_namespace
NAMESPACE
default
hbase
2 DDL
1.建表
create :建表 hbase(main):010:0> create 'user_info','base_info','extra_info' => Hbase::Table - user_info hbase(main):043:0> create 'ns1:user_info', {NAME=>'base_info',BLOOMFILTER=>'ROWCOL',VERSIONS=>'3'}
2.list : 查询所有的表
hbase(main):002:0> list
TABLE
ns1:t1
ns1:user_info
2 row(s) in 0.2830 seconds => ["ns1:t1", "ns1:user_info"]
3.describe : 查询表结构
hbase(main):003:0> describe 'ns1:user_info'
4.create , splits : 创建表分片
hbase(main):007:0> create 'ns1:t2', 'f1', SPLITS => ['10', '20', '30', '40']
5.修改表,添加修改列簇信息
hbase(main):009:0> alter 'ns1:t1', {NAME=>'lixi_info'}
hbase(main):010:0> describe 'ns1:t1'
6.删除列簇
hbase(main):014:0> alter 'ns1:t1', 'delete' => 'lixi_info'
7.删除表(先要disable表,再删除表)
hbase(main):016:0> disable 'ns1:t1'
0 row(s) in 2.2790 seconds hbase(main):017:0> drop 'ns1:t1'
0 row(s) in 1.2900 seconds
3.DML
1.插入数据(put命令,不能一次性插入多条)
hbase(main):012:0> put 'user_info','001','base_info:username','lixi'
2.scan扫描
hbase(main):024:0> scan 'user_info'
3.通过指定版本查询
hbase(main):024:0> scan 'user_info', {RAW => true, VERSIONS => 1}
4.查询指定列的数据
hbase(main):014:0> scan 'user_info',{COLUMNS => 'base_info:name'}
5.分页查询
hbase(main):021:0> scan 'user_info', {COLUMNS => ['base_info:name', 'base_info:age'], LIMIT => 10, STARTROW => '001'}
6.get查询
hbase(main):015:0> get 'user_info','001','base_info:username'
7.根据时间戳查询
hbase(main):029:0> get 'user_info', '001', {TIMERANGE => [1546922817429, 1546922931075]}
8.hbase的一个重要特性:排序特性(rowkey)
插入到hbase中去的数据,hbase会自动排序存储:
排序规则: 首先看行键,然后看列族名,然后看列(key)名; 按字典顺序
.9.更新数据
hbase(main):010:0> put 'user_info', '001', 'base_info:name', 'rock'
10.incr
hbase(main):053:0> incr 'user_info', '002', 'base_info:age3'
11.删除一个kv数据
hbase(main):058:0> delete 'user_info', '002', 'base_info:age3'
12.删除一行数据
hbase(main):028:0> deleteall 'user_info','001'
13.删除指定的版本
hbase(main):081:0> delete 'user_info','001','extra_info:feature', TIMESTAMP=>1546922931075
14.删除一个表数据
disable 'user_info'
drop 'user_info'
15.判断表是否存在
hbase(main):083:0> exists 'user_info'
16.表生效和失效
hbase(main):084:0> enable 'user_info'hbase(main):085:0> disable 'user_info'
17.统计表行数
hbase(main):088:0> count 'user_info'
18.清空表数据
hbase(main):089:0> truncate 'user_info'