HBase 是一个开源的分布式非关系型数据库,在大数据行业中应用很广泛。Google 的三篇论文奠定了大数据的理论基础,其中 HBase 就可以看做是 BigTable 的实现,用来存储大规模的数据。
HBase 的命令很多,这篇文章总结了 HBase 最常用的 shell 命令,作为日常开发的手册。
本文基于 JDK1.8 HBase2.2.5
本文假设你已经了解 HBase 的基本概念
HBase 单机版安装
本文基于单机版的 HBase 进行操作,单机版的 HBase 使用起来非常方便,不要配置 HDFS,直接就可以使用,在这里下载 HBase。
下载完成之后,直接解压:
tar xzvf hbase-2.2.5-bin.tar.gz
cd hbase-2.2.5
然后进入 conf 目录,编辑 hbase-env.sh,找到下面这行,配置上 JDK 的目录(HBase 2.2.5 需要 JDK1.8 以上):
# export JAVA_HOME=/usr/java/jdk1.8.0/
# 改成你的 jdk 目录
export JAVA_HOME=your jdk dir
然后启动 HBase:
./bin/start-habse.sh
然后通过命令行连接 HBase:
./bin/hbase shell
到这里,就完成了单机版 HBase 的安装和启动。
HBase 虽然经常和 HDFS 一起出现,但并不是非得使用 HDFS 作为底层文件系统,也可以选择其他的文件系统,比如电脑的本地文件系统。
基本操作
连上 HBase 之后,就可以对 HBase 进行操作了,HBase 有一些基本的命令来查看 HBase 当前的状态和属性。
连接上 HBase 之后,查看当前连接的用户是谁:
whoami
查看有哪些表:
list
查看 HBase 服务器状态:
status
查看 HBase 版本:
version
查看其他命令使用,比如查看 list 命令的详细信息(注意要加引号):
help 'list'
表操作
HBase 的建表和 MySQL 等关系型数据库不一样,需要提前创建表结构,对于 HBase 来说,建表很简单,下面全程使用 students 表为例,students 表有两个列族 NO
和 Info
,分别表示学生的学号和详细信息。
创建 namespace:
create_namespace 's_school'
修改 namespace:
alter_namespace 's_school', {METHOD=>'set', NAME => 'school'}
删除 namespace,只有在 namespce 为空时才能删除:
drop_namespace 's_school'
创建 students 表,如果创建表的时候不指定 namespace,name表都会放到默认的 default namespace:
cereate 's_school:students', 'No', 'Info'
下面的演示都没有使用 namespace。
查看表的详细信息:
describe 'students'
查看表是否存在:
exists 'students'
禁用表:
disable 'students'
启用表:
enable 'students'
查看表是否被禁用/启用:
is_enabled 'students' # 表是否启用
is_disabled 'students' # 表是否禁用
为表增加列族:
alter 'students', 'Extra'
删除一个列族:
alter 'students', {NAME=>'Extra', METHOD=>'delete'}
删除表,需要注意,删除表之前要先禁用表:
disable 'students'
drop 'students'
增
表创建好了就可以往表里面写数据了,添加数据使用 put 命令。
插入学生 ID:
put 'students', '100001', 'No', '100001'
在上面的语句中,直接向 No 这个列族中插入了一条数据。
插入学生姓名,在 Info 列族下,多加了一个 name 列:
put 'students', '100001', 'Info:name', 'Tom'
还可以插入年龄:
put 'students', '100001', 'Info:age', '18'
只要你愿意,可以增加任意多的列(qualifier)。
HBase 中更新数据使用的也是 put 命令:
put 'students', '100001', 'Info:age', '24'
查
HBase 中查询数据有两种方式 get 和 scan,get 直接通过 rowkey 获取数据,因为有索引的加持,速度非常快,而 scan 则需要通过扫描区间来获取数据,性能会低很多。
通过 get 获取数据:
get 'students', '100001'
结果如下:
COLUMN CELL
Info:age timestamp=1591224539219, value=24
Info:name timestamp=1591224215833, value=Tom
No: timestamp=1591224003381, value=100001
1 row(s)
使用 scan 方式如下:
scan 'students'
也可以指定返回结果的行数:
scan 'students', {LIMIT=>10}
还可以获得指定列族或者列的数据:
scan 'students', {COLUMNS=>'Info:age'}
如果获取多个列族,或者多个列:
scan 'students', {COLUMNS=>['Info:age', 'No']}
还可以通过制定 rowkey 的前缀查询,这个功能很常用,这样查询的速度会快很多:
scan 'students', {STARTROW => '100'}
如果要统计整个表中数据的行数:
count 'students'
删
删除数据也很简单,可以删除一个列或者一个列族或者一行:
删除一个列族的最新数据:
delete 'students', '100001', 'No'
删除一个列的最新数据:
delete 'students', '100001', 'Info:age'
delete 只能删除一个版本的数据,如果要删除所有版本的数据,需要使用 deleteall:
删除一个列的所有:
deleteall 'students', '100001', 'Info:age'
删除一行数据:
deleteall 'students', '100001'
文 / Rayjun
关注微信公众号,聊点其他的