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是列存储。

posted @ 2023-10-29 12:12  zhenjingcool  阅读(116)  评论(0编辑  收藏  举报