HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。接下来记录一下HBase的一些基本的使用:
基本命令
- 在Hbase安装目录下的bin目录,执行如下命令,进入交互式环境:
./hbase shell
- 退出交互式环境
quit
通用命令
- status:HBase的状态,例如服务器的数量
hbase(main):001:0> status
1 active master, 1 backup masters, 2 servers, 0 dead, 1.0000 average load
- version:获取正在使用的HBase版本
hbase(main):002:0> version
1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
- table_help:表引用命令提供帮助
hbase(main):003:0> table_help
Help for table-reference commands.
You can either create a table via 'create' and then manipulate the table via commands like 'put', 'get', etc.
See the standard help information for how to use each of these commands.
...
- whoami:提供有关用户的信息
hbase(main):004:0> whoami
root (auth:SIMPLE)
groups: root
数据定义语言
- create:创建表
# test为表名,cf为列族
create 'test','cf'
- list:列出HBase的所有表
list
- disable:禁用表
disable 'test'
- is_disabled:验证表是否被禁用
is_disabled 'test'
- enable: 启用表
enable 'test'
- is_enabled:验证表是否被启用
is_enabled 'test'
- describe:提供了一个表的描述
describe 'test'
- alter:修改表结构
# 添加一个列族df
alter 'test','df'
- exists:验证表是否存在
exists 'test'
- drop:删除表,需先禁用才能删除
drop 'test'
- disable_all:禁用多个表
# 禁用表明以te开头的所有表
disable_all 'te.*'
- drop_all:删除多个表,需先禁用才能删除
# 删除表明以te开头的所有表
drop_all 'te.*'
- Java Admin API:在此之前所有的上述命令,Java提供了一个通过API编程来管理实现DDL功能
数据操纵语言
- put:插入数据
# 'test'表名,'row1'行,'cf:a'列(由列族加冒号再拼接一个后缀形成),value值
put 'test','row1','cf:a','value'
- get:获取数据
# 获取row1行的所有数据
get 'test','row1'
# 获取row1行,cf:a列的数据
get 'test','row1','cf:a'
- delete:删除表中单元格的数据
# 删除row1行,cf:a列的数据
delete 'test','row1','cf:a'
- deleteall:删除一行的数据
deleteall 'test','row1'
- scan:扫描并返回表数据
scan 'test'
- count:计数并返回表中行的数量
count 'test'
- truncate:禁用、删除和重新创建一个具有默认选项的表。注意,该表必须先存在才能执行此操作!!!类似于清空表的数据
truncate 'test'
- Java client API:在此之前所有上述命令,Java提供了一个客户端API来实现DML功能,CRUD(创建检索更新删除)操作更多的是通过编程,在org.apache.hadoop.hbase.client包下
HBase操作进阶
我们还可以在创建表的同时给这个表分配一个变量,通过这个表里来间接操作表:
- 创建表时,给表赋予一个变量:
t = create 'test','cf'
- 也可以给已存在的表赋予一个变量:
t = get_table 'test'
- 插入数据:
t.put 'row1','cf:a','value'
- 扫描数据:
t.scan
- 获取一个表的描述:
t.describe
- 禁用:
t.disable
- 删除:
t.drop
读写HBase配置
hbase(main):002:0> @shell.hbase.configuration.get('hbase.rpc.timeout')
=> "60000"
更改远程连接超时时间:
hbase(main):001:0> @shell.hbase.configuration.setInt('hbase.rpc.timeout',61010)
hbase(main):002:0> @shell.hbase.configuration.get('hbase.rpc.timeout')
=> "61010"
以命令读取并执行文件中HBase Shell的命令
我们可以将HBase Shell 命令输入到文本文件当中,每一行为一个命令,假设有这样一个文件test
:
create 'user','cf'
put 'user','row1','cf:a','zhangsan'
scan 'user'
此时我们使用命令读取并执行这个文件中存储的命令,首先我们先进入到HBase的存放目录,进入bin目录,执行下面命令:
root@master:/usr/local/hbase/bin# ./hbase shell ~/test
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
0 row(s) in 3.0610 seconds
0 row(s) in 0.3280 seconds
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1512723251727, value=zhangsan
1 row(s) in 0.1680 seconds
可以看出,HBase执行了文件当中的命令