HBase简介及搭建
一、概述
HBase是基于hadoop的数据库工具。
1、特点
HBase来源于google的一篇论文BigTable,后来由Apache做了开源实现就是HBase。是一种NoSQL、非关系型的数据库、不符合关系型数据库的范式。
适合存储半结构化、非结构化的数据;适合存储稀疏的数据,稀疏的数据中空的数据不占用空间。
面向列(族)进行存储,提供实时增删改查的能力,是一种真正的数据库。
可以存储海量数据、性能也很强大,可以实现上亿条记录的毫秒级别的查询,但是不能提供严格的事务控制,只能在行级别保证事务。
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用hbase技术可以在廉价的PC上搭建起大规模结构化存储集群。
HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。
2、逻辑结构
HBase通过表来存储数据,但是表的结构和关系型数据库非常的不一样。
1.行键
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作左填充。
行的一次读写是原子操作(不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
2.列族(簇)
Column Family:是表的元数据的一部分,需要在建表时声明,不能后期增加,如果需要增加只能alter表,一个列族可以包含一个或多个列。
3.列
Column:可以动态增加列,不需要提前声明,在使用的时候随时可以增加,不是表的元数据一部分,归属于一个列族。
4.单元格与时间戳
cell timestamp:通过row和columns确定的一个存储单元。每个存储单元中都保存着一个数据的多个版本,版本通过时间戳来区别,而由row column和timestamp确定出来的唯一的存储数据的单元,称之为一个cell单元格。
数据都以二进制形式存储,没有数据类型的区别。所有空数据都不占用空间。
5.Cell
由{row key, column( =<family> <label>), version}唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
二、安装配置
1、准备
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完全分布式集群搭建
2、安装
1.单机模式
直接解压安装包。
代码语言:javascript复制tar -zxvf xxxxx.tar.gz
1>hbase-site.xml
修改conf/hbase-site.xml。
配置hbase使用的数据文件的位置,默认在/tmp/hbase-[username],此目录是linux的临时目录,可能会被系统清空,所以最好修改一下。
代码语言:javascript复制<property>
<name>hbase.rootdir</name>
<value>file:///<path>/hbase</value>
</property>
2.伪分布式模式
1>hbase-env.sh
修改conf/hbase-env.sh,将JAVA_HOME的值改为和环境变量中一样的。
代码语言:javascript复制export JAVA_HOME=xxxx
2>hbase-site.xml
修改hbase-site.xml,配置要使用的hdfs信息。
代码语言:javascript复制<!--设置hdfs的地址-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop01:9000/hbase</value>
</property>
<!--设置副本个数-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
启动hbase。
3.完全分布式模式
1>配置文件
①hbase-env.sh
hbase-env.sh配置HBase启动时需要的相关环境变量。
修改conf/hbase-env.sh,将JAVA_HOME的值改为和环境变量中一样的。
代码语言:javascript复制export JAVA_HOME=xxxx
HBASE_MANAGES_ZK默认是注销的,默认是开启的,需要禁用对zookeeper的自动管理,将值改为false。如果不修改,那么Zookeeper将会随着HBase启动和关闭,这样会导致其他使用Zookeeper的服务,无法使用。
代码语言:javascript复制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访问地址。
代码语言:javascript复制<!--配置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。
3、启动集群
启动顺序如下:
启动zookeeper->启动hadoop->启动hbase。
代码语言:javascript复制./start-hbase.sh
启动完成之后,可以通过http://xxxxx:60010地址来访问web界面,检查启动是否成功。通过web见面管理hbase,也可以通过hbase shell脚本来访问bhase。
可以启动备用master实现高可用,这里启动备用master不需要多余配置,只需要在对应的服务器中执行如下命令即可:
代码语言:javascript复制hbase-daemon.sh start master
HBase使用的master热备的原理和Hadoop中NameNode的热备原理相同,都是利用Zookeeper来实现的。
关闭集群:
代码语言:javascript复制stop-hbase.sh
三、基本操作
1、命令
代码语言:javascript复制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'
2、解析
1.创建
建表时可以指定VERSIONS,配置的是当前列族在持久化到文件系统中时,要保留几个最新的版本数据,这并不影响内存中的历史数据版本。
代码语言:javascript复制hbase>create 'testtable',{NAME=>'colfam1',VERSIONS=>3},{NAME=>'colfam2',VERSIONS=>1}
hbase>put 'testtable','myrow-1','colfam1:q1','value-1'
2.查看
代码语言:javascript复制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只能查询到最新版本的数据。
代码语言:javascript复制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指定查询最新的几个版本的数据。
代码语言:javascript复制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
代码语言:javascript复制hbase>scan 'testtable',{RAW=>true,VERSIONS=>3}
hbase>exit
bin/stop-hbase.sh
3、注意
hbase命令行下不能直接使用删除删除字符:
可以使用ctrl 删除键来进行删除。
或
修改xshell配置:
文件->属性->终端->键盘
->delete键序列[VT220Del]
->backspace键序列[ASCII127]