HBASE是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。
HBASE和MongoDB,redis一样,均是一种NoSql型数据库。
HBase简介
HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续存储在磁盘上。表中的每个单元格值都具有时间戳。其数据模型如下图所示:
总之,在HBase中,
表是行的集合。
行是列族的集合。
列族是列的集合。
列是键值对的集合。
这里的列式存储或者说面向列,其实说的是列族存储,HBase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
HBase与RDBMS比较
HBase安装(linux环境)
下载Hbase,并解压到/usr/local目录下,将其改名为hbase。进入其bin目录可以看到版本:
$ ./hbase version
版本如下:
如果提示没有JAVA_HOME,则进入conf目录修改hbase-env.sh文件中的JAVA_HOME设置。
另外,设置HBASE_MANAGES_ZK为true,表示由hbase自己管理zookeeper,不需要单独的zookeeper。HBASE_CLASSPATH路径设置为/usr/local/hbase/conf目录。
在habse-site.xml中设置hbase.rootdir,用于指定HBase数据的存储位置,如果不设置的话,hbase.rootdir默认为/tmp/hbase-${user.name},这意味着每次重启系统都会丢失数据。设置如下:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///usr/local/hbase/hbase-data</value>
</property>
</configuration>
详细过程见参考资料1。
进入bin目录,运行start-hbase.sh即可启动:
$ ./start-hbase.sh
再通过bin/hbase shell打开shell命令行模式,用户可以通过输入shell命令操作HBase数据库:
/usr/local/hbase/bin$ ./hbase shell
打开的命令行模式如下:
输入exit则可停止HBase。
注意:如果在操作HBase的过程中发生错误,可以通过{HBASE_HOME}目录(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。
输入list可查看所有的表,如下:
安装模式
Hbase有三种安装模式,单机,伪分布式和完全分布式。上面的安装过程是一种单机模式。
想要使用伪分布式集群,则需要安装hadoop(详见参考资料2)。这里将hadoop解压到/usr/local目录下。修改配置文件core-site.xml:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/hadoop_data</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
修改hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value> # 伪分布式集群设置副本数量为1
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/hadoop_data/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name
<value>file:/usr/local/hadoop/hadoop_data/hdfs/datanode</value>
</property>
</configuration>
在安装并配置好hadoop的基础上,对Hbase进行分布式配置:
修改hbase.rootdir,指定HBase数据在HDFS上的存储路径;将属性hbase.cluter.distributed设置为true。假设当前Hadoop集群运行在伪分布式模式下,在本机上运行,且NameNode运行在9000端口:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>
接下来就可以运行分布式环境下的hbase了。
进入hadoop的sbin目录,运行start-dfs.sh,即可启动hadoop。从命令行可以看出,启动了namenode和两个datanode。
然后进入hbase的bin目录启动hbase:
$ ./start-hbase.sh
输入jps看到以下界面说明hbase启动成功:
进入shell界面:
$./hbase shell
后即可通过命令行操作hbase了。
(注意:如果list命令出现zookeeper data == null的提示,说明是hadoop配置有误,请检查配置)
HBase使用
命令 | 说明 |
status | 查看habse状态 |
create ‘表名’,‘列族名1’,‘列族名2’,‘列族名N’ | 创建表 |
list | 列出所有表 |
describe ‘表名’ | 描述表 |
exists ‘表名’ | 判断表是否存在 |
is_enabled/is_disabled ‘表名’ | 判断是否启用/禁用表 |
put ‘表名’,‘rowkey’,‘列族:列’,‘值’ | 添加记录 |
get ‘表名’,‘rowkey’ | 查看rowKey下的所有数据 |
scan ‘表名’ | 查看所有记录 |
count ‘表名’ | 查看表中记录总数 |
get ‘表名’,‘rowkey’,'列族‘ | 获取某个列族 |
get ‘表名’,‘rowkey’,‘列族:列’ | 获取某个列族的某个列 |
delete ‘表名’,‘行名’,‘列族:列’ | 删除记录 |
deleteall ‘表名’,‘rowkey’ | 删除整行 |
第一步 disable ‘表名’,第二步 drop ‘表名’ | 先要屏蔽该表,才能对该表进行删除 |
truncate ‘表名’ | 清空表 |
scan ‘表名’,{COLUMNS=>‘列族名:列名’} | 查看某个表某个列中的所有数据 |
创建表User,有一个列族info:
描述表:
判断表是否禁用/启用:
添加记录:
查询:
查询所有记录:语法:scan <table>, {COLUMNS => [family:column, ...], LIMIT => num}
范围查询:
另外,还可以添加TIMERANGE和FILTER等高级功能,STARTROW、ENDROW必须大写,否则报错,查询结果不包含等于ENDROW的结果集。删除记录:
禁用或启用表:
删除表:
本文介绍了HBase的基本概念,安装,命令行交互。下一篇文将继续介绍通过java和python操作hbase。