hbase是以Google BigTable为原型的一个高可靠性、高可扩展性、实时读写的列存储数据库。它的本质是一张稀疏的大表,用来存储粗粒度的结构化数据,并且能够通过简单地增加节点来实现系统的线性扩展。
hbase运行在分布式文件系统HDFS之上。HDFS全称是hadoop distributed file system。hbase的数据以表的方式进行组织,每个表由行列组成。与传统的关系型数据库不同的是,hbase每个列属于一个特定的列族,通过行和列来确定一个存储单元,而每个存储单元又可以有多个版本,通过时间戳来标识。hbase还有一个概念叫行键,这个行键就好像mysql的主键一样,是唯一的,可以标识一条记录。
hbase集群包含两种角色:HMaster和HRegionServer。当表随着记录条数的增加而不断变大后,将会分裂成一个个Region,每个Region可以由(startKey, endKey)来表示,它包含一个startKey到endKey的半闭区间。一个HRegionServer可以管理多个Region,并由HMaster来负责HRegionServer的调度及集群状态的监管。由于Region可分散且由不同的HRegionServer来管理,因此理论上再大的表都可以通过集群来处理,只需增加HRegionServer即可。
启动hbase后,用hbase自带的命令行客户端hbase shell连上hbase。
hbase基础命令:
1、查看hbase集群状态:status
2、列出所有的表:list
3、创建一个表,创建表时必须至少指定一个列族:create '表名', '列族1', '列族2'
如create 'person', 'address', 'info'
4、查看表定义:desc '表名'
如desc 'person'
5、给表添加数据:put '表名', 'rowKey', '列族名:列名', '值'。一次只能给一个列赋值
如put 'person', '1', 'info:name', 'zhangsan'
6、根据rowKey查看数据:get 'person', 'rowKey'
如get 'person', '1'
7、根据rowKey查看对应列的数据:get 'person', 'rowKey', '列族名:列名'
如get 'person', '1', 'info:name'
8、查看表的记录数:count '表名'
如count 'person'
9、查看表的所有记录:scan '表名'
如scan 'person'
10、查看表中指定列族的所有记录:scan '表名', {COLUMNS=>'列族名'}。COLUMNS必须是大写,小写会报语法错误
如scan 'person', {COLUMNS=>'info'}
还可以查看指定区间的所有记录:scan '表名', {STARTROW=>'开始rowKey', STOPROW=>'结束rowKey'}。STARTROW、STOPROW值必须用单引号括住
如scan 'person', {STARTROW=>'1', ENDROW=>'100'}
也可以指定列族,如scan 'person', {COLUMNS=>'info', STARTROW=>'1', ENDROW=>'100'}
还可以指定size,如scan 'person', {COLUMNS=>'info', LIMIT=>5, STARTROW=>'1', ENDROW=>'100'}
11、根据rowKey删除记录:deleteall '表名', 'rowKey'
如deleteall 'person', '4'
还可以只删除某个列的数据:delete '表名', 'rowKey', '列族名:列名'
如delete 'person', 1, 'info:name'
12、删除表:要先disable,再drop
如disable 'person'
drop 'person'
从上面命令可以看出,访问hbase数据,只有三种方式:一种是通过指定rowKey进行,另一种是指定rowKey的range进行scan,最后就是全表scan。 由于全表扫描对于性能消耗很大,基本不用,所以rowKey设计的好坏很大程度上影响hbase的性能。
用phoenix访问hbase。
启动phoenix命令行客户端。
1、列出所有的表:!tables
2、查看表结构:!describe 表名
3、ddl
create table if not exists us_population (
state char(2) not null,
city varchar not null,
population bigint
constraint us_population_pk primary key (state, city)
);
4、dml
sql操作表即可。
插入不是insert into,而是upsert into,等同于insert+update。
如果用jdbc连接phoenix的话,驱动类是org.apache.phoenix.jdbc.PhoenixDriver,hbase连接地址是jdbc:phoenix:${zookeeper.url}。
hbase shell创建的表,如何通过phoenix查询到?
在phoenix创建视图,格式如下:
create view person_view (
pk varchar primary key,
"info"."name" varchar,
"info"."age" varchar,
"info"."birthday" varchar,
"info"."company" varchar,
"address"."contry" varchar,
"address"."province" varchar,
"address"."city" varchar
) as select * from "person";
这样phoenix通过查询person_view视图就可以查到person表的数据了。select * from person_view;