HBase(Hadoop Database)是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java。它是Apache软件基金会的Hadoop项目的一部分,运行于HDFS文件系统之上,它可以容错地存储海量稀疏的数据。
HBase在列上实现了BigTable论文提到的压缩算法、内存操作和布隆过滤器。HBase的表能够作为MapReduce任务的输入和输出,可以通过Java API来访问数据,也可以通过REST、Avro或者Thrift的API来访问。
在 CAP理论中,HBase属于CP类型的系统。
安装单机环境
去apache官方网站,下载 HBase 。点击 stable目录,然后下载hbase-1.2.6-bin.tar.gz。解压即可
tar xzvf hbase-1.2.6-bin.tar.gz
cd hbase-1.2.6/
先安装java环境。设置环境变量JAVA_HOME
编辑 conf/hbase-site.xml 配置hbase.rootdir,来选择HBase将数据写到哪个目录。将 DIRECTORY 替换成你期望写文件的目录。默认hbase.rootdir 是指向 /tmp/hbase-${user.name}
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:/home/users/xxxxxx/hbase_data/</value>
</property>
</configuration>
启动HBase
./bin/start-hbase.sh
现在运行的是单机模式的Hbaes,所有的服务都运行在一个JVM上。通过jps命令查看HMaster进程。HBase的日志放在logs目录,当你启动出问题的时候,可以检查这些日志。
关闭HBase
./bin/stop-hbase.sh
stopping hbase....................
数据模型
在HBase中,数据存储在具有行和列的表中。这是与关系数据库(RDBMS)的术语重叠,但并不相同。相反,HBase表应该被视为多维映射。
表(Table)
HBase表由多行组成。
行(Row)
HBase中的一行由行键(row key)和一个或多个列组成。行键按字母顺序排序,因此,行键的设计是非常重要的。目标是相关相近的行存储在一起。如果你的行键是网站域名,你应该可以将它们反向存储(org.apache.www,org.apache.mail,org.apache.jira)。这样,所有的apache域名都在表中临近存储,而不是由于二级域名而分散。
列(Column)
HBase中的列由列族和列限定符组成,它们由一个:(冒号)字符分隔。
列族(Column Family)
列族经常出于性能考虑,共同定位一组列及其值。每列族都具有一组存储属性,例如它的值是否应该缓存在内存中,它的数据如何被压缩或者它的行键如何被编码等等。表中的每一行都具有相同的列族,尽管某些行可能不会在给定列族中存储任何内容。
列限定符(Column Qualifier)
列限定符被添加到列族中以提供给定数据片段的索引。 比如列族content,列限定符可能是content:html,另一个可能是content:pdf。 尽管列族在表创建时已经确定,但列限定符是可变的,并且可能不同行的之间有很大不同。
单元(cell)
一个{row, column, version} 元组确定一个HBase中的一个 cell。包含值和时间戳。
时间戳(Timestamp)
时间戳与每个值一起写入,并且是值的给定版本的标识符。默认情况下,时间戳记表示server端写入数据的时间,但可以在数据写入时指定时间戳值。
shell命令
连接到HBase
$ ./bin/hbase shell
hbase(main):001:0>
创建一个名为 t1 的表,这个表只有一个 列族 为 cf
hbase(main):003:0> create 't1','cf'
0 row(s) in 1.2360 seconds
=> Hbase::Table - t1
查看数据表
hbase(main):004:0> list 't1'
TABLE
t1
1 row(s) in 0.0050 seconds
=> ["t1"]
hbase(main):005:0> describe 't1'
Table t1 is ENABLED
t1
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCO
DING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536',
REPLICATION_SCOPE => '0'}
1 row(s) in 0.0940 seconds
插入数据
put 't1', 'row1', 'cf:a', 'value1'
put 't1', 'row2', 'cf:b', 'value2'
put 't1', 'row3', 'cf:c', 'value3'
HBase中的列是由 列族前缀和列的名字组成的,以冒号间隔
扫描全表
hbase(main):011:0> scan 't1'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1497426156495, value=value1
row2 column=cf:b, timestamp=1497426156519, value=value2
row3 column=cf:c, timestamp=1497426157158, value=value3
3 row(s) in 0.0090 seconds
按范围查找rowkey
hbase(main):015:0> scan 't1' , {STARTROW=>'row1',STOPROW=>'row2'}
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1497426156495, value=value1
1 row(s) in 0.0100 seconds
查找一行记录
hbase(main):016:0> get 't1','row1'
COLUMN CELL
cf:a timestamp=1497426156495, value=value1
1 row(s) in 0.0190 seconds
REST接口
HBase附带的REST服务器,可以作为一个守护进程运行。 使用以下命令之一在前台或后台启动REST服务器。 端口是可选的,默认为8080。
# Foreground
$ bin/hbase rest start -p <port>
# Background, logging to a file in $HBASE_LOGS_DIR
$ bin/hbase-daemon.sh start rest -p <port>
以下命令都可以使用curl或wget命令运行。可以输入纯文本。也可以在HEADER中添加“Accept:text / xml”标头,接收xml;“application / json”表示json
一般情况下,使用GET请求进行查询,PUT或POST请求进行创建或更新,删除使用DELETE。
查看系统版本号
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/version/cluster"
也可以直接在浏览器中输入url
查看集群状态
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/status/cluster"
列出非系统数据表
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/"
查看某张表的schema
curl -vi -X GET -H "Accept: text/xml" "http://localhost:8081/t1/schema"