一、简介和启动
1、 简介
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式NoSQL数据库
利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务
主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库)
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map
2、启动
首先启动hadoop,start-all.sh ,然后分别启动zookeeper, zkServer.sh start
最后启动hbase start-hbase.sh
关闭 stop-hbase.sh
二、数据结构和数据模型
1、逻辑结构
2、存储结构
3、数据模型概念
三、Hbase shell命令学习
1、进入HBASE
命令: hbase shell
2、help 查看Hbase shell 支持命令,分组如下:
(1)general
processlist, status, table_help, version, whoami
(2)namespace
alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
(3)dml
append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve
(4)ddl
alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, list_regions, locate_region, show_filters
3、general
查看版本:
version
查看HBASE当前状态:
status
4、namespace 命名空间
(1)create_namespace 创建命名空间
create_namespace 'mydb1'
create_namespace 'mydb2',{'create_time' => '2022-04-25'} 添加详细信息
(2)list_namespace 查看当前所有的命名空间
结果中:
default -- 用户默认使用的命名空间
hbase -- hbase中存放的是HBase内置的表
(3)describe_namespace 查看命名空间的详细信息
describe_namespace '命名空间'
(4)alter_namespace 修改命名空间
METHOD必须大写,不区分大小写
增加author配置并且修改create_time配置,操作为set,后面为添加和覆盖配置信息
alter_namespace 'mydb2',{'METHOD' => 'set', 'author'=> 'act', 'create_time' => '2022-4-27'}
删除create_time配置,操作unset,后面name为删除的信息关键字
alter_namespace 'mydb2',{'METHOD' => 'unset', NAME=>'create_time'}
(5)drop_namespace 删除空的命名空间
drop_namespace 'mydb2'
(6)list_namespace_tables 查看指定命名空间下的表
list_namespace_tables '命名空间'
5、DDL-表操作
(1)create 创建表
ns1:表示命名空间 t1:表示表名称 f1:表示列族
格式:
hbase> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
hbase> create 't1', 'f1', 'f2', 'f3'
hbase> t1 = create 't1', 'f1'
实例:
默认命名空间default下创建mytb1表,列族为info
create 'mytb1', 'info'
指定命令空间,在db1命名空间下创建表
create_namespace 'db1'
创建一个列族:create 'db1:mytb1', 'info1'
创建表时指定多个列族
create 'db1:mytb2', 'info1', 'info2', 'info3'
创建表并指定列族版本
create 'db1:mytb4',{NAME => 'info1',VERSIONS => 3}
(2)describe 查看表的具体信息
样例:
describe 'db1:mytb2'
表中的列族信息中可以看出,每个列族都维护自己的一个版本信息,一个列族对应一个store
desc 'db1:mytb2' 功能一样
(3)alter 修改表
help 'alter'
样例:
1.修改列族版本号
格式:alter 't1', NAME => 'f1', VERSIONS => 5
alter 'db1:mytb4', NAME => 'info1', VERSIONS => 4
2.删除列族
格式:alter 'ns1:t1', 'delete' => 'f1'
alter 'db1:mytb2','delete' => 'info3'
格式:alter 'ns1:t1', NAME => 'f1', METHOD => 'delete'
alter 'db1:mytb2', NAME => 'info2', METHOD => 'delete'
(4)删除表
help 'drop'
注意: 使用drop操作时先需要执行disable
样例:
1.disable 'db1:mytb2' 关闭表
2.drop 'db1:mytb2'
(5)关闭及启用表
1.关闭表操作:
disable 'db1:mytb1'
desc 'db1:mytb1'
2.启用表操作:
enable 'db1:mytb1'
desc 'db1:mytb1'
7、DML-表数据操作
r1 表示 rowKey
c1 表示 列名称
(1)put 上传及修改数据操作
格式:
hbase> put 'ns1:t1', 'r1', 'c1', 'value'
hbase> put 't1', 'r1', 'c1', 'value'
hbase> put 't1', 'r1', 'c1', 'value', ts1
hbase> put 't1', 'r1', 'c1', 'value', {ATTRIBUTES=>{'mykey'=>'myvalue'}}
hbase> put 't1', 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}}
hbase> put 't1', 'r1', 'c1', 'value', ts1, {VISIBILITY=>'PRIVATE|SECRET'}
样例:
create 'db1:stu', 'info' 创建一个表
put 'db1:stu', '1001', 'info:name', 'zhangsan' 给表上传数据
注:修改数据可以直接用put上传最新数据进行替换、
put 'db1:stu', '1001', 'info:age', '12'
put 'db1:stu', '1001', 'info:age', '13' get时12已经被13覆盖
(2)get 获取一行数据操作
格式:
hbase> t.get 'r1'
hbase> t.get 'r1', {TIMERANGE => [ts1, ts2]}
hbase> t.get 'r1', {COLUMN => 'c1'}
hbase> t.get 'r1', {COLUMN => ['c1', 'c2', 'c3']}
hbase> t.get 'r1', {COLUMN => 'c1', TIMESTAMP => ts1}
hbase> t.get 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}
hbase> t.get 'r1', {COLUMN => 'c1', TIMESTAMP => ts1, VERSIONS => 4}
hbase> t.get 'r1', {FILTER => "ValueFilter(=, 'binary:abc')"}
hbase> t.get 'r1', 'c1'
hbase> t.get 'r1', 'c1', 'c2'
hbase> t.get 'r1', ['c1', 'c2']
hbase> t.get 'r1', {CONSISTENCY => 'TIMELINE'}
hbase> t.get 'r1', {CONSISTENCY => 'TIMELINE', REGION_REPLICA_ID => 1}
样例:
get 'db1:stu', '1001' 查询了上面上传的数据。
put 'db1:stu', '1001', 'info:age', '12'
get 'db1:stu', '1001'
put 'db1:stu', '1001', 'info:age', '13'
获取指定ROWKEY中某一列数据
get 'db1:stu', '1001', 'info:age'
获取指定RowKey下的多列数据
get 'db1:stu', '1001', 'info:age','info:name'
(3)scan 获取表中所有数据
1.scan 'db1:stu'
2.ROWKEY是根据字典排序,并且排序的依据是按位比较ASCII码表,1001、10010、1002
按ROWKEY范围进行取值 左闭右开 取值包含STARTROW 不包含 STOPROW
scan 'db1:stu', {STARTROW => '1001',STOPROW => '1004'}
根据ASCII码表取
scan 'db1:stu', {STARTROW => '1001!',STOPROW => '1001~'}
3.查看表中所有数据并展示所有版本信息
scan 'db1:stu' ,{RAW=>true,VERSIONS=>10}
4.list_namespace_tables '命令空间' 查看所有表
5.count 统计表中数据量
count 'db1:stu'
6.删除列
delete 'db1:stu','1001','info:age','1650941469177'
7.删除一个rowkey
deleteall 'db1:stu','1001'
8.清空表数据
truncate 'db1:stu'