Hbase教程
Hbase是一个Hadoop Database,是分布式、弹性、大数据存储引擎
Hbase的目标是托管大表-数十亿行数百万列。
1 安装
Hbase版本和java版本以及Hadoop版本之间存在依赖关系。可以在这里查看https://hbase.apache.org/book.html#java
1.1 Stand-alone安装
在这里,我们不配置 hbase.rootdir ,默认会将我们hbase数据存储在./tmp下,且不使用HDFS文件系统。
首先,下载安装包
[admin@localhost software]$ wget https://dlcdn.apache.org/hbase/2.5.5/hbase-2.5.5-bin.tar.gz --no-check-certificate
解压,并进入目录
[admin@localhost software]$ tar -zxvf hbase-2.5.5-bin.tar.gz [admin@localhost software]$ cd hbase-2.5.5/
设置JAVA_HOME环境变量
[admin@localhost hbase-2.5.5]$ vi conf/hbase-env.sh export JAVA_HOME=/data/software/jdk-11.0.2
启动
[admin@localhost hbase-2.5.5]$ bin/start-hbase.sh running master, logging to /data/software/hbase-2.5.5/bin/../logs/hbase-admin-master-localhost.localdomain.out
然后,我们可以查看该进程,HMaster就是我们刚才启动的进程
[admin@localhost hbase-2.5.5]$ jps -l 11555 org.apache.hadoop.hbase.master.HMaster 11915 jdk.jcmd/sun.tools.jps.Jps [admin@localhost hbase-2.5.5]$
然后,我们可以在页面查看
http://192.168.xxx.xxx:16010/
查看以及操作Hbase数据库,执行如下命令
$ ./bin/hbase shell
hbase:001:0> create 'test', 'cf' #创建表 hbase:002:0> list 'test' #查看表 hbase:003:0> describe 'test' #查看表详情 hbase:005:0> put 'test', 'row1', 'cf:a', 'value1' #插入一条数据 hbase:006:0> put 'test', 'row2', 'cf:b', 'value2' hbase:007:0> put 'test', 'row3', 'cf:c', 'value3' hbase:008:0> scan 'test' #查询表 ROW COLUMN+CELL row1 column=cf:a, timestamp=2023-10-28T21:07:40.959, value=value1 row2 column=cf:b, timestamp=2023-10-28T21:07:47.509, value=value2 row3 column=cf:c, timestamp=2023-10-28T21:07:52.445, value=value3 3 row(s) Took 0.0632 seconds hbase:009:0>
1.2 伪分布式部署
首先关闭Hbase服务
[admin@localhost hbase-2.5.5]$ ./bin/stop-hbase.sh
配置conf/hbase.site.xml
默认配置为
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hbase.cluster.distributed</name> <value>false</value> </property> <property> <name>hbase.tmp.dir</name> <value>./tmp</value> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> </configuration>
我们改为
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:9000/hbase</value> </property> </configuration>
启动,首先我们要保证hdfs正在运行。然后启动hbase
[admin@localhost hbase-2.5.5]$ bin/start-hbase.sh
我们在hdfs文件系统中查看一下刚才启动的hbase目录
[admin@localhost hadoop-3.3.6]$ ./bin/hadoop fs -ls /hbase Found 12 items drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/.hbck drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/.tmp drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/MasterData drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/WALs drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/archive drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/corrupt drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/data -rw-r--r-- 3 admin supergroup 42 2023-10-28 22:45 /hbase/hbase.id -rw-r--r-- 3 admin supergroup 7 2023-10-28 22:45 /hbase/hbase.version drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/mobdir drwxr-xr-x - admin supergroup 0 2023-10-28 22:45 /hbase/oldWALs drwx--x--x - admin supergroup 0 2023-10-28 22:45 /hbase/staging [admin@localhost hadoop-3.3.6]$
至此,伪分布式部署完成。
我们仍然可以创建表,查看表
[admin@localhost hbase-2.5.5]$ bin/hbase shell hbase:001:0> create 'test', 'cf' hbase:002:0> list 'test' hbase:007:0> scan 'test' ROW COLUMN+CELL row1 column=cf:a, timestamp=2023-10-28T22:57:23.174, value=value1 row2 column=cf:b, timestamp=2023-10-28T22:57:29.223, value=value2 2 row(s) Took 0.0924 seconds hbase:008:0>
1.3 HMaster备份
HMaster服务控制着HBase集群,我们最多可以创建9个HMaster服务的备份。
[admin@localhost hbase-2.5.5]$ ./bin/local-master-backup.sh start 2 3 5 running master, logging to /data/software/hbase-2.5.5/bin/../logs/hbase-admin-2-master-localhost.localdomain.out running master, logging to /data/software/hbase-2.5.5/bin/../logs/hbase-admin-3-master-localhost.localdomain.out running master, logging to /data/software/hbase-2.5.5/bin/../logs/hbase-admin-5-master-localhost.localdomain.out [admin@localhost hbase-2.5.5]$
上面命令,我们创建了3个HMaster服务备份,HMaster主服务占用16000/16010端口。我们创建的这三个备份服务分别占用16002/16012、16003/16013、16005/16015端口。
2 概念模型
参考:https://dzone.com/articles/understanding-hbase-and-bigtab
简单的说,HBase就是一个key-value数据库,但是又不像Mongo有那么高的自由度。其必须有rowkey,column family,qualifier,timestamp。
如果我们摒弃row、column的概念,而是使用key-value对的概念去理解它,将会容易的多。
在Google Bigtable Paper中定义了什么是Big Table
A Bigtable is a sparse, distributed, persistent multidimensional sorted map. Bigtable是一个稀疏的,分布式的,持久化的,多维度的,有序的map
2.1 HBase是一个有序的map
首先,Hbase是一个map。而且这个map是严格按照rowkey排序的,比如
{ "1" : "x", "aaaaa" : "y", "aaaab" : "world", "xyz" : "hello", "zzzzz" : "woot" }
2.2 持久化
这个不用多解释
2.3 分布式的
HBase是存储在分布式文件系统之上的。而且往往有多个副本以保证高可用。
2.4 多维-Column Families维度
如下所示,第一层级我们称之为rowkey,第二层级'A','B'我们称之为column families。在HBase中规定Column Families是在创建表的时候定义的,后续不能变动。这是Hbase和MongoDB的其中一个不同点。
Column Families维度也是有序的。
{ "1" : { "A" : "x", "B" : "z" }, "aaaaa" : { "A" : "y", "B" : "w" }, "aaaab" : { "A" : "world", "B" : "ocean" }, "xyz" : { "A" : "hello", "B" : "there" }, "zzzzz" : { "A" : "woot", "B" : "1337" } }
2.5 多维-qualifier维度
在Column Families中可以有任意多个qualifier。这一维度也是有序的。
{ // ... "aaaaa" : { "A" : { "foo" : "y", "bar" : "d" }, "B" : { "" : "w" } }, "aaaab" : { "A" : { "foo" : "world", "bar" : "domination" }, "B" : { "" : "ocean" } }, // ... }
2.6 多维-timestamps维度
每一条记录会存储多个时间戳对应的值。且也是有序的,按时间戳倒序排序。
{ // ... "aaaaa" : { "A" : { "foo" : { 15 : "y", 4 : "m" }, "bar" : { 15 : "d", } }, "B" : { "" : { 6 : "w" 3 : "o" 1 : "w" } } }, // ... }
2.7 稀疏
我们前面提到过,虽然一个表的Column Families是固定的,但是qualifier是任意的。
如果以二维表的视角看待,这个表是稀疏的。可能一行数据中,绝大多数列都是没有值的。
在物理存储上,属于同一Column Family的数据被组织在一起存储。也就是说Hbase是列存储。