开篇
传统数据库结构是这样的:
RDBMS-Table.png但在NoSQL领域,数据表的模样是这样的:
NoSQLTable.pngHBase,就属于该派系的一个典型代表。这些”杂乱无章”的列所构成的多行数据,被称之为一个”稀疏矩阵”,而上图中的每一个”黑块块”,在HBase中称之为一个KeyValue。
Apache HBase是基于Hadoop构建的一个分布式的、可伸缩的海量数据存储系统。
(数据量<10GB,适合Mongodb;数据量>10TB,适合HBase)
数据模型
RowKey
用来表示唯一一行记录的主键,HBase的数据是按照RowKey的字典顺序进行全局排序的,所有的查询都只能依赖于这一个排序维度。
稀疏矩阵
HBase中一个表的数据是按照稀疏矩阵的方式组织的:
RowKey | Columns |
---|---|
Row1 | {id, name, phone} |
Row2 | {id, name, address, title, email} |
Row3 | {id, address, email} |
看的出来:每一行中,列的组成都是灵活的,行与行之间并不需要遵循相同的列定义
Region
HBase中采用了”Range分区”,将Key的完整区间切割成一个个的”Key Range” ,每一个”Key Range”称之为一个Region。
也可以这么理解:将HBase中拥有数亿行的一个大表,横向切割成一个个”子表“,这一个个”子表“就是Region:
Regions.pngRegion是HBase中负载均衡的基本单元,当一个Region增长到一定大小以后,会自动分裂成两个。
Column Family
如果将Region看成是一个表的横向切割,那么,一个Region中的数据列的纵向切割,称之为一个Column Family。每一个列,都必须归属于一个Column Family,这个归属关系是在写数据时指定的,而不是建表时预先定义。
RegionAndColumnFamilies.pngKeyValue
每一行中的每一列数据,都被包装成独立的拥有特定结构的KeyValue,KeyValue中包含了丰富的自我描述信息:
Key | ColumnFamily | Qualifier | Timestamp | Type | Value | Tags |
---|---|---|---|---|---|---|
HBase shell 练习
在hadoop环境
启动命令
$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.1.2.2.6.4.0-91, r2a88e694af7238290a5747f963a4fa0079c55bf9, Thu Jan 4 10:42:39 UTC 2018
hbase(main):001:0>
创建表
create {table_name}, {column_family_name}
hbase(main):002:0> create 'test', 'cf'
0 row(s) in 1.5670 seconds
=> Hbase::Table - test
hbase(main):003:0>
列出表信息
hbase(main):003:0> list 'test'
TABLE
test
1 row(s) in 0.0190 seconds
=> ["test"]
向表中插入数据
hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.1150 seconds
hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0100 seconds
hbase(main):007:0> put 'test', 'row3', 'cf:c', 'value3,roy3'
0 row(s) in 0.0080 seconds
扫描表中所有数据
hbase(main):008:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1539671480227, value=value1
row2 column=cf:b, timestamp=1539671504820, value=value2
row3 column=cf:c, timestamp=1539671656111, value=value3,roy3
3 row(s) in 0.0240 seconds
获取一行数据
hbase(main):009:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=1539671480227, value=value1
1 row(s) in 0.0180 seconds
禁用/启用表格
hbase(main):028:0> disable 'test'
0 row(s) in 2.2640 seconds
hbase(main):029:0> enable 'test'
0 row(s) in 1.2330 seconds
退出
hbase(main):030:0> quit
网友评论