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; 

相关文章: