一、Hbase介绍
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase与传统关系数据库的对比分析
- 数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串;
- 数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系;
- 存储模式:关系数据库是基于行模式存储的。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的;
- 数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引——行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来;
- 数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留;
- 可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩
组成架构
了解更多请参考博客:分布式数据库 HBase(详解) - 知乎 (zhihu.com)
二、全分布模式Hbase集群安装与配置
实验环境
centos系统
masters主机和slave1主机,并且确保两台主机都已经配置好hadoop和zookeeper
Hbase安装
注意:以下操作都在master主机进行
1、下载Hbase的二进制包,下载地址位于Apache HBase – Apache HBase Downloads,然后解压到目录/usr/local下。
sudo cp /home/qyf/Desktop/hbase-1.2.4-bin.tar /usr/local
sudo tar -xvf hbase-1.2.4-bin.tar
2、输入下面的代码修改环境变量
sudo vi /etc/profile
添加如下内容:
export HBASE_HOME=/usr/local/hbase-1.2.4
export PATH=$PATH:$HBASE_HOME/bin:/$HBASE_HOME/sbin
使其生效:
source /etc/profile
3、修改刚刚解压的hbase文件夹权限
sudo chmod -R 777 /usr/local/hbase-1.2.4
Hbase配置
1、进入解压的文件夹hbase-1.2.4文件夹下conf文件夹,编辑里面的hbase-env.sh文件,输入以下内容打开该文件:
sudo vi hbase-env.sh
进入以后,逐行寻找"export JAVA_HOME=" "这一行,修改为export JAVA_HOME=/usr/java/jdk,并把前面的注释去掉
2、修改Hbase配置文件hbase-site.xml文件,修改内容如下:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hbase-1.2.4/zookeeper</value>
</property>
</configuration>
3、修改regionservers文件,删掉localhost,添加下面的内容
slave1
注意,这里面填的是运行HRegionServer的服务器,实际名字按个人配置的来,我这里是slave1
然后进入slave1主机,向/usr/local文件夹添加用户权限
sudo chmod -R 777 /usr/local
写好后,返回master主机,运行下面的代码
sudo scp -r /usr/local/hbase-1.2.4 qyf@slave1:/usr/local
注意:根据个人主机名字修改上面的内容
4、依次输入下面两行代码,依次启动Hadopp、Hbase服务
start-all.sh
start-hbase.sh
如果启动成功,则会显示下面的内容:
[qyf@master conf]$ start-hbase.sh
slave1: starting zookeeper, logging to /usr/local/hbase-1.2.4/bin/../logs/hbase-qyf-zookeeper-slave1.out
master: zookeeper running as process 8463. Stop it first.
starting master, logging to /usr/local/hbase-1.2.4/logs/hbase-qyf-master-master.out
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hbase-1.2.4/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
slave1: starting regionserver, logging to /usr/local/hbase-1.2.4/bin/../logs/hbase-qyf-regionserver-slave1.out
slave1: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
slave1: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
三、使用Hbase Shell
Hbase为用户提供了一个非常方便的工具Hbase Shell,它支持绝大部分Hbase命令,可以高效的创建、删除、修改表,以下是Hbase Shell常用的命令
输入下面的命令,启动Hbase Shell
hbase shell
下面使用一些常用的命令:
1、创建表
create 't1','f1'
上面的命令创建了表t1,列族f1
2、添加数据
put 't1','row1','f1:name','zhangsan'
上面的命令向表t1添加一条数据,其中RowKey的值为row1,name列的值为”zhangsan“
执行下面的命令,向表t1中添加一条数据,RowKey的值为row2,age列的值为”18“
put 't1','row2','f1:age','18'
3、扫描表
scan 't1'
执行该命令扫描表t1,并查看数据描述
hbase(main):004:0> scan 't1'
ROW COLUMN+CELL
row1 column=f1:name, timestamp=1712654963152, value=zhangsan
row2 column=f1:age, timestamp=1712654997540, value=18
2 row(s) in 0.0200 seconds
4、修改表
put 't1','row1','f1:name','lisi'
修改row1中的name列的值,将”zhangsan“改为”lisi“
再执行scan命令,发现row1中name列的值变为了“lisi”
hbase(main):006:0> scan 't1'
ROW COLUMN+CELL
row1 column=f1:name, timestamp=1712655075552, value=lisi
row2 column=f1:age, timestamp=1712654997540, value=18
2 row(s) in 0.0100 seconds
5、删除特定单元格
delete 't1','row1','f1:name'
执行该命令可以删除表中RowKey为row1的行的单元格name,再执行scan命令,可以看到RowKey为row1的行不存在了,因为row1只有一个单元格name,既然后者已被删除,前者也不存在了
hbase(main):008:0> scan 't1'
ROW COLUMN+CELL
row2 column=f1:age, timestamp=1712654997540, value=18
1 row(s) in 0.0100 seconds
6、删除一整行数据
deleteall 't1','row2'
执行上面的命令,可以删除RowKey为row2的行中的所有单元格
hbase(main):010:0> scan 't1'
ROW COLUMN+CELL
0 row(s) in 0.0070 seconds
再执行scan命令可以看到RowKey为row2的行已经不存在了
7、删除整张表
disable 't1'
drop 't1'
删除整张表,需要先禁用表,然后再删除表