使用
Hbase是一个高可靠性、高性能、可伸缩、分布式、基于列存储的非关系型(NoSQL)数据库。hbase将数据存储在HDFS集群上,备份机制齐全。通过 ZooKeeper 协调查找数据,访问速度快。
架构
HMaster Server :负责管理所有的 HRegion Server,每台 HRegion Server 都会和 HMaster Server 通信。本身不存储 HBase 中的任何数据,存储数据到 HRegion Server 的映射,告诉每台 HRegion Server 要维护哪些HRegion。
HRegionServer:HBase 逻辑上的表可能会被划分为多个HRegion,然后存储到 HRegion Server 群中。一台机器上一般只运行一个 HRegion Server。
HRegion:表的大小超过设置的值,自动将表划分为不同的区域,每个区域包含所有行的子集。从物理上讲,一张表被拆分成了多块,每一块儿就是一个 HRegion。
ZooKeeper:协调 HBase 中所有的服务器。处理 HBase 服务器运行期间可能发生的错误。
mysql表和hbase表的区别:
mysql表
| id | name | age | math | english |
|---|---|---|---|---|
| 01 | jack | 33 | null | 90 |
hbase表
| rowkey | base Info | score Info | timeStamp | ||
| name | age | math | english | ||
| 1001 | jack | t1 | |||
| 1001 | 33 | t2 | |||
| 1001 | 90 | t4 | |||
插入元素时,是按照(key-value对)一个一个的插入。如果出现一个列的值为空,就不会加入这条数据,而不是像mysql一样用null占位。
hbase表构成(按照数据定位的顺序):
行键(rowkey):每一行数据的唯一标识符,也是插入数据时的key值.表中数据按照rowkey的字典排序
列簇(列族)(columns family):一个列簇包含多个列。列簇:列名。一般不要定义多个列簇。
时间戳(timeStamp):默认是插入数据时的时间,用户可以显示定义。在每个 Cell中,不同版本的数据按照时间戳降序排序,即最新的数据排在最前面。
单元(cell):每个单元的数据,数据没有类型,全都是字节码形式存储
版本(version):修改一次,就会有一个这个数据的版本,默认保存保存一个版本,也就是当前的版本,一般会自定义3,即保存当前的和上次修改和上上次修改的数据。
特点:
数据类型单一:无类型定义,只有字符串
大
无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
稀疏:对于为空(null)的列,并不占用存储空间。
顺序:每个 Cell中,不同版本的数据按照时间戳降序排序,即最新的数据排在最前面。
常用命令;
#查看帮助手册
hbase
#进入客户端,任意一台服务器
hbase shell
#一下命令全是进入客户端之后的:
#如果要删除输入的命令:ctrl+backspace
#全部帮助信息
help
#ddl组的帮助信息
help \'ddl\'
#一个命令的帮助信息
help \'list\'
#查看状态
status
DDL操作:
#ddl组
#区分大小写
#创建表,指定表名,和列簇
create \'student\',\'base_info\',\'course_info\'
#指定版本号,关键字都是大写
create \'stu_version\', {NAME=>\'base_info\',VERSIONS=>2},{NAME=>
\'course_info\',VERSIONS=>1}
#查看表
list
#查看表结构:describe \'表名\'
describe \'student\'
#修改表
alter \'stu_version\',{NAME=>\'course_info\',VERSIONS=>3}
#删除列簇
alter \'student\',{NAME=>\'course_info\',METHOD=>\'delete\'}
#删除表:先禁用后删除
disable \'student\'
drop \'student\'
#查看表是否存在
exists \'student\'
#查看是否被禁用
is_disabled \'stu_version\'
#差看是否不禁用
is_enabled \'stu_version\'
enable \'stu_version\'
DML操作:
#添加数据 put表名,rowkey
put \'stu_version\',\'1001\',\'base_info:name\',\'jack\'
put \'stu_version\',\'1001\',\'base_info:age\',22
put \'stu_version\',\'1001\',\'course_info:math\',\'100\'
put \'stu_version\',\'1001\',\'course_info:english\',\'80\'
put \'stu_version\',\'1002\',\'base_info:name\',\'tom\'
put \'stu_version\',\'1002\',\'base_info:age\',23
put \'stu_version\',\'1002\',\'course_info:english\',\'80\'
put \'stu_version\',\'1003\',\'base_info:name\',\'ella\'
put \'stu_version\',\'1003\',\'base_info:age\',22
put \'stu_version\',\'1003\',\'course_info:math\',\'90\'
#查询数据
scan \'stu_version\'
#前两行
scan \'stu_version\',{LIMIT=>2}
#查看base_info:name的前两行
scan \'stu_version\',{COLUMNS=>\'base_info:name\',LIMIT=>2}
#根据行键获取一行的数据
get \'stu_version\',\'1001\'
#根据行键和列簇
get \'stu_version\',\'1001\',\'base_info\'
get \'stu_version\',\'1001\',\'base_info:name\'
#查看行数
count \'stu_version\'
#修改数据
put \'stu_version\',\'1001\',\'course_info:math\',90
get \'stu_version\',\'1001\',\'course_info:math\'
#查看多个版本的数据
#根据时间戳,不好用
get \'stu_version\',\'1001\',{COLUMNS=>\'course_info:math\',TIMESTAMP=>1542251077928}
#获取最新的两个版本,按照时间戳降序排序
get \'stu_version\',\'1001\',{COLUMNS=>\'course_info:math\',VERSIONS=>2}
#删除数据
#删除列
delete \'stu_version\',\'1001\',\'course_info:math\',1542251943336
#删除所有的版本
delete \'stu_version\',\'1001\',\'course_info:math\'
#删除行
deleteall \'stu_version\',\'1001\'
scan \'stu_version\'
#清空表
truncate \'stu_version\'
如果有问题,请提出,谢谢。