HBase Shell
HBase shell使用起来最方便,进入HBase shell控制台就可以使用。
$ $HBASE_HOME/bin/hbase shell
常见操作有
create(创建表)/
put(插入或更新数据)/
get(依据rowkey查询)/
scan(范围查询)/
delete(删除列)/
deleteAll(依据rowkey删除整行数据)/
disable&
drop(禁用表之后再删除)。
基于数据库的项目,往往会在某个文件夹下存储专门的sql脚本,记录每次迭代数据库变更;同理,HBase脚本也能够组织成文件,用同样的方式管理起来:
#!/bin/sh
exec $HBASE_HOME/bin/hbase shell <<EOF
create 'twits',{NAME => 't', VERSIONS => 1}
EOF
值得一提的是,HBase shell是用JRuby实现的,所以create语句语法类似于Ruby的函数调用。HBase相同提供了JRuby版client,简单强大。。
REST
如图,REST Gateway Service以独立进程执行,它负责和HBase通信。为了避免RESTserver单点问题,提高吞吐量,能够启动多台RESTserver组成集群,但要注意的是,Scanner API是有状态的,须要进行资源分配,所以进行scan操作时,client要始终连接同一台RESTserver。
以后台进程启动REST服务。
$ hbase-daemon.sh start rest -p 9999
starting rest, logging to logs/hbase-hbase-rest-ubuntu.out
REST服务支持多种响应格式,比方XML、JSON、Protobufs和文本。以下演示样例调用RESTAPI,更改用户密码。注意列名和值都须要使用Base64编码。
$curl -XPUT \
-H"Content-Type: application/json" \
http://localhost:9999/users/TheRealMT/info:password\
-d'{
"Row": [
{
"Cell": [
{
"column":"aW5mbzpwYXNzd29yZA==",
"$": "NzBOQHJJIE4wIDcwdDBSMA=="
}
],
"key":"VGhlUmVhbE1U"
}
]
}'
Thrift
对于非Java码农,最方便的还是使用跨语言RPC调用框架Thrift。HBase提供了Thrift IDL服务描写叙述接口,支持多达14种不同语言,并实现了对应的后台服务。
Thrift服务的架构与REST服务类似。Thriftclient在一次会话内,都和一台server保持连接,所以建立Thrift Gateway集群,进行负载均衡要方便一些。
首先启动Thrift服务:
$ hbase thrift start
...
ThriftServer:starting HBase ThreadPool Thrift server on /0.0.0.0:9090
client依据不同语言进行代码生成,以Python为例:
$ thrift -gen py../hbase-0.92.1/src/main/resources/org/apache/hadoop/hbase/
thrift/Hbase.thrift
各个语言的API接口都和JAVAclient基本一致,用法就不多说了。
Asynchbase:异步client
原生的JAVAclient全然是同步的。Asynchbase是全新实现的异步client,Asynchbase的最主要用户是OpenTSDB(存储层使用HBase的开源大规模集群监控系统,请參考http://opentsdb.net/)。
下图异步请求过程參考opentsdb:
- client发送异步请求。
- 获得异步结果Deferred(类似于Java的Future接口)。
- 注冊回调Callbacks到Deferred,完毕client逻辑所在线程返回。
- 服务端异步运行数据请求,完毕后触发回调。
Asynchbase具有下面几个特点:
- 异步&非堵塞&线程安全,所以特别适合大量并发写操作场景,提供更高的吞吐量
- 多版本号支持,Asynchbase是全然又一次实现的接口,所以不像原生client,须要和相应版本号的集群配套使用。
- API方面最强大的是Callback回调链,链上的前一个callback将返回结果作为參数传递给下一个callback,进行一连串的异步操作组合。