HBase是基于hadoop的数据库工具。linux
HBase来源于google的一篇论文BigTable,后来由Apache作了开源实现就是HBase。是一种NoSQL、非关系型的数据库、不符合关系型数据库的范式。 web
适合存储半结构化、非结构化的数据;适合存储稀疏的数据,稀疏的数据中空的数据不占用空间。shell
面向列(族)进行存储,提供实时增删改查的能力,是一种真正的数据库。数据库
能够存储海量数据、性能也很强大,能够实现上亿条记录的毫秒级别的查询,可是不能提供严格的事务控制,只能在行级别保证事务。apache
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用hbase技术能够在廉价的PC上搭建起大规模结构化存储集群。数组
HBase利用Hadoop HDFS做为其文件存储系统,利用Hadoop的MapReduce来处理HBase中的海量数据,利用Zookeeper做为协调工具。bash
HBase经过表来存储数据,可是表的结构和关系型数据库很是的不同。服务器
RowKey:即HBase的主键,HBase表中全部记录都必须有行键,且不可重复。并发
访问HBase中的数据有三种方式:分布式
经过单一行键访问、经过一组行键访问、全表扫描。
由于存储的数据内容为半结构化和非结构化的缘由,只能使用这几种方式查询。
Row key行键能够是任意字符串,最大长度是64KB,实际应用中长度通常为10-100bytes,在hbase内部,row key保存为字节数组。
存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分利用排序存储这个特性,将常常一块儿读取的行存储放到一块儿。
注意:
字典序对int排序的结果是1,10,100,11,2,20,21,…,9,91,96,97,98,99。要保持整形的天然序,行键必须用0做左填充。
行的一次读写是原子操做(不论一次读写多少列)。这个设计决策可以使用户很容易的理解程序在对同一个行进行并发更新操做时的行为。
Column Family:是表的元数据的一部分,须要在建表时声明,不能后期增长,若是须要增长只能alter表,一个列族能够包含一个或多个列。
Column:能够动态增长列,不须要提早声明,在使用的时候随时能够增长,不是表的元数据一部分,归属于一个列族。
cell timestamp:经过row和columns肯定的一个存储单元。每一个存储单元中都保存着一个数据的多个版本,版本经过时间戳来区别,而由row column和timestamp肯定出来的惟一的存储数据的单元,称之为一个cell单元格。
数据都以二进制形式存储,没有数据类型的区别。全部空数据都不占用空间。
由{row key, column( =<family> + <label>), version}惟一肯定的单元。cell中的数据是没有类型的,所有是字节码形式存贮。
HBase版本对Hadoop版本有严格的要求,搭配以下:
|
HBase-0.92.x |
HBase-0.94.x |
HBase-0.96 |
Hadoop-0.20.205 |
S |
X |
X |
Hadoop-0.22.x |
S |
X |
X |
Hadoop-1.0.x |
S |
S |
S |
Hadoop-1.1.x |
NT |
S |
S |
Hadoop-0.23.x |
X |
S |
NT |
Hadoop-2.x |
X |
S |
S |
X:表示不兼容,S:表示兼容,NT:表示未知
前提条件:
安装jdk、Zookeeper和Hadoop,并配置环境变量。
这次演示版本选择以下:
jdk:1.8
Zookeeper:3.4.7
Hadoop:2.7.1
Hbase:0.98.17
Zookeeper安装参见:Zookeeper集群的搭建
Hadoop安装能够参见:Hadoop伪分布式模式搭建、Hadoop彻底分布式集群搭建
直接解压安装包。
tar -zxvf xxxxx.tar.gz
修改conf/hbase-site.xml。
配置hbase使用的数据文件的位置,默认在/tmp/hbase-[username],此目录是linux的临时目录,可能会被系统清空,因此最好修改一下。
<property> <name>hbase.rootdir</name> <value>file:///<path>/hbase</value> </property>
修改conf/hbase-env.sh,将JAVA_HOME的值改成和环境变量中同样的。
export JAVA_HOME=xxxx
修改hbase-site.xml,配置要使用的hdfs信息。
<!--设置hdfs的地址--> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop01:9000/hbase</value> </property> <!--设置副本个数--> <property> <name>dfs.replication</name> <value>1</value> </property>
启动hbase。
①hbase-env.sh
hbase-env.sh配置HBase启动时须要的相关环境变量。
修改conf/hbase-env.sh,将JAVA_HOME的值改成和环境变量中同样的。
export JAVA_HOME=xxxx
HBASE_MANAGES_ZK默认是注销的,默认是开启的,须要禁用对zookeeper的自动管理,将值改成false。若是不修改,那么Zookeeper将会随着HBase启动和关闭,这样会致使其余使用Zookeeper的服务,没法使用。
export HBASE_MANAGES_ZK=false
②hbase-site.xml
hbase-site.xml配置HBase基本配置信息。HBASE启动时默认使用hbase-default.xml中的配置,若是须要能够修改hbase-site.xml文件,此文件中的配置将会覆盖hbase-default.xml中的配置。修改配置后要重启hbase才会起做用。
修改hbase-site.xml,配置开启彻底分布式模式。
配置hbase.cluster.distributed为true。
配置hbase.rootdir设置为HDFS访问地址。
<!--配置hdfs链接地址这里使用的是hadoop伪分布式,因此只配置了一个地址--> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop01:9000/hbase</value> </property> <!--配置副本个数--> <property> <name>dfs.replication</name> <value>1</value> </property> <!--配置启动HBase集群模式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!--配置Zookeeper的链接地址--> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property>
③regionservers
配置region服务器,修改conf/regionservers文件,其中配置全部hbase主机,每一个主机名独占一行,hbase启动或关闭时会按照该配置顺序启动或关闭主机中的hbase。
启动顺序以下:
启动zookeeper->启动hadoop->启动hbase。
./start-hbase.sh
启动完成以后,能够经过http://xxxxx:60010地址来访问web界面,检查启动是否成功。经过web见面管理hbase,也能够经过hbase shell脚原本访问bhase。
能够启动备用master实现高可用,这里启动备用master不须要多余配置,只须要在对应的服务器中执行以下命令便可:
hbase-daemon.sh start master
HBase使用的master热备的原理和Hadoop中NameNode的热备原理相同,都是利用Zookeeper来实现的。
关闭集群:
stop-hbase.sh
bin/start-hbase.sh bin/hbase shell hbase>status hbase>help hbase>create 'testtable',''colfam1','colfam2' hbase>list hbase>describe 'testtable' hbase>put 'testtable','myrow-1','colfam1:q1','value-1' hbase>put 'testtable','myrow-2','colfam1:q2','value-2' hbase>put 'testtable','myrow-2','colfam1:q3','value-3' hbase>scan 'testtable' hbase>get 'testtable','myrow-1' hbase>delete 'testtable','myrow-2','colfam1:q2' hbase>scan 'testtable' hbase>disable 'testtable' hbase>drop 'testtable'
建表时能够指定VERSIONS,配置的是当前列族在持久化到文件系统中时,要保留几个最新的版本数据,这并不影响内存中的历史数据版本。
hbase>create 'testtable',{NAME=>'colfam1',VERSIONS=>3},{NAME=>'colfam2',VERSIONS=>1} hbase>put 'testtable','myrow-1','colfam1:q1','value-1'
hbase> scan 'hbase:meta' hbase> scan 'hbase:meta', {COLUMNS => 'info:regioninfo'} hbase> scan 'ns1:t1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'} hbase> scan 't1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'} hbase> scan 't1', {COLUMNS => 'c1', TIMERANGE => [1303668804, 1303668904]} hbase> scan 't1', {REVERSED => true} hbase> scan 't1', {FILTER => "(PrefixFilter ('row2') AND (QualifierFilter (>=, 'binary:xyz'))) AND (TimestampsFilter ( 123, 456))"} hbase> scan 't1', {FILTER => org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)} hbase> scan 't1', { COLUMNS => ['c1', 'c2'], ATTRIBUTES => {'mykey' => 'myvalue'}} hbase> scan 't1', { COLUMNS => ['c1', 'c2'], AUTHORIZATIONS => ['PRIVATE','SECRET']} hbase> scan 't1', {COLUMNS => ['c1', 'c2'], CACHE_BLOCKS => false} hbase> scan 't1', {RAW => true, VERSIONS => 10}
直接使用scan而不加RAW=>true只能查询到最新版本的数据。
hbase>scan 'testtable' hbase>put 'testtable','myrow-1','colfam1:q1','value-2' hbase>scan 'testtable' hbase>put 'testtable','myrow-1','colfam1:q1','value-3' hbase>scan 'testtable'
能够在查询时加上RAW=>true来开启对历史版本数据的查询,VERSIONS=>3指定查询最新的几个版本的数据。
hbase>scan 'testtable',{RAW=>true,VERSIONS=>3} hbase>put 'testtable','myrow-1','colfam1:q1','value-4' hbase>scan 'testtable' hbase>scan 'testtable',{RAW=>true,VERSIONS=>3} hbase>put 'testtable','myrow-1','colfam2:x1','value-1' hbase>scan 'testtable' hbase>put 'testtable','myrow-1','colfam2:x1','value-2' hbase>scan 'testtable' hbase>scan 'testtable',{RAW=>true,VERSIONS=>3}
重启hbase
hbase>scan 'testtable',{RAW=>true,VERSIONS=>3} hbase>exit bin/stop-hbase.sh
hbase命令行下不能直接使用删除删除字符:
可使用ctrl+删除键来进行删除。
或
修改xshell配置:
文件->属性->终端->键盘
->delete键序列[VT220Del]
->backspace键序列[ASCII127]
下一篇:HBase工做原理