HBase 集群安装部署

Master 节点

  1. 下载安装包
    1
    https://archive.apache.org/dist/hbase/2.3.3/
  2. 解压安装包到指定的规划目录 /opt/software
    1
    2
    tar -zxvf hbase-2.3.3-bin.tar.gz -C /opt/servers

    配置文件

指定 JDK

1
2
3
4
5
6
7
8
vcd /opt/servers/hbase-2.3.3/conf
vim hbase-env.sh

# 修改以下配置
export JAVA_HOME=/usr/java/jdk1.8.0_202

# 不使用自带的zk
export HBASE_MANAGES_ZK=false

修改 hbase-site.xml

vim hbase-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--指定hbase是分布式的  PS:如果配置文件中有则修改,没有则添加-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

<!--指定hbase在HDFS上存储的路径-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>

<!--指定zk的地址,多个用“,”分割-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>

修改 regionservers 文件

指定 regionserver 节点
vim regionservers
删除文件中的所有内容!!!在添加以下内容

1
2
3
master
slave1
slave2

配置高可用

hbase 的 conf 目录下创建文件 backup-masters (Standby Master)

这样启动的时候会在 master 和 salve1 都启动一个 HMaster 节点

1
slave2

分发 HBase

1
2
cd /opt/servers
rsync-script hbase-2.3.3

配置 HBase 环境变量

所有机器都需要配置

1
2
3
4
5
6
7
8
vim /etc/profile

# HBase
export HBASE_HOME=/opt/servers/hbase-2.3.3
export PATH=$PATH:$HBASE_HOME/bin

# 使配置生效
source /etc/profile

启动 Hbase 集群

  • 前提条件:必须先启动 hadoop 和 zookeeper 集群
    1
    2
    3
    4
    5
    6
    7
    # 如果已经启动则忽略
    # master 节点 启动 Hadoop
    start-dfs.sh
    # slave2 节点 启动 YARN
    satrt-yarn.sh
    # master 节点 启动zk
    ~/shells/zk.sh start

启动 / 停止 HBase

1
2
start-hbase.sh
stop-hbase.sh

image

启动完成后可以通过 http://master:16010 进入 Hbase Web 端

启动 hbase 集群后如果只显示 master 请检查配置和系统时间是否一致

image-20220726144404329

HBase shell 基本操作

1、进入 Hbase 客户端命令操作界面

1
hbase shell

2、查看帮助命令

1
hbase(main):001:0> help

3、查看当前数据库中有哪些表

1
hbase(main):006:0> list

4、创建一张 test 表, 包含 base_info、extra_info 两个列族 \

1
2
3
4
5
hbase(main):001:0> create 'test', 'base_info', 'extra_info'
或者(Hbase建表必须指定列族信息)
create 'test', {NAME => 'base_info', VERSIONS => '3'},{NAME =>
'extra_info',VERSIONS => '3'}
VERSIONS 是指此单元格内的数据可以保留最近的 3 个版本

5、添加数据操作

  • 向 test 表中插入信息,row key 为 rk1,列族 base_info 中添加 name 列标示符,值为 wang

    1
    hbase(main):001:0> put 'test', 'rk1', 'base_info:name', 'wang'
  • 向 test 表中插入信息,row key 为 rk1,列族 base_info 中添加 age 列标示符,值为 30

    1
    hbase(main):001:0> put 'test', 'rk1', 'base_info:age', 30
  • 向 test 表中插入信息,row key 为 rk1,列族 extra_info 中添加 address 列标示符,值为 shanghai

    1
    hbase(main):001:0> put 'test', 'rk1', 'extra_info:address', 'shanghai'

6、查询数据
6.1 通过 rowkey 进行查询

  • 获取表中 row key 为 rk1 的所有信息

    1
    2
    3
    4
    5
    6
    7
      hbase(main):001:0> get 'test', 'rk1'

    6.2 查看rowkey下面的某个列族的信息

    - 获取test表中row key为rk1,base_info列族的所有信息
    ```shell
    hbase(main):001:0> get 'test', 'rk1', 'base_info'

6.3 查看 rowkey 指定列族指定字段的值

  • 获取表中 row key 为 rk1,base_info 列族的 name、age 列标示符的信息

    1
    hbase(main):008:0> get 'test', 'rk1', 'base_info:name', 'base_info:age'

6.4 查看 rowkey 指定多个列族的信息

  • 获取 test 表中 row key 为 rk1,base_info、extra_info 列族的信息

    1
    2
    3
    4
    5
    6
    7
    hbase(main):010:0> get 'test', 'rk1', 'base_info', 'extra_info'
    或者
    hbase(main):011:0> get 'test', 'rk1', {COLUMN => ['base_info', 'extra_info']}
    或者
    hbase(main):012:0> get 'test', 'rk1', {COLUMN => ['base_info:name',
    'extra_info:address']}

6.5 指定 rowkey 与列值查询

  • 获取表中 row key 为 rk1,cell 的值为 wang 的信息

    1
    2
    hbase(main):001:0> get 'test', 'rk1', {FILTER => "ValueFilter(=,
    'binary:wang')"}

6.6 指定 rowkey 与列值模糊查询
获取表中 row key 为 rk1,列标示符中含有 a 的信息

1
2
hbase(main):001:0> get 'test', 'rk1', {FILTER => "
(QualifierFilter(=,'substring:a'))"}

6.7 查询所有数据
查询 test 表中的所有信息

1
hbase(main):000:0> scan 'test'

6.8 列族查询
查询表中列族为 base_info 的信息

1
2
3
4
5
hbase(main):001:0> scan 'test', {COLUMNS => 'base_info'}
hbase(main):002:0> scan 'test', {COLUMNS => 'base_info', RAW => true, VERSIONS
=> 3}
## Scan时可以设置是否开启Raw模式,开启Raw模式会返回包括已添加删除标记但是未实际删除的数据
## VERSIONS指定查询的最大版本数

6.9 指定多个列族与按照数据值模糊查询

查询 test 表中列族为 base_info 和 extra_info 且列标示符中含有 a 字符的信息

1
2
hbase(main):001:0> scan 'test', {COLUMNS => ['base_info', 'extra_info'], FILTER
=> "(QualifierFilter(=,'substring:a'))"}

6.10 rowkey 的范围值查询(非常重要)

  • 查询 test 表中列族为 base_info,rk 范围是 [rk1, rk3) 的数据(rowkey 底层存储是字典序)
  • 按 rowkey 顺序存储。
1
2
hbase(main):001:0> scan 'test', {COLUMNS => 'base_info', STARTROW => 'rk1',
ENDROW => 'rk3'}

6.11 指定 rowkey 模糊查询
查询 test 表中 row key 以 rk 字符开头的

1
hbase(main):001:0> scan 'test',{FILTER=>"PrefixFilter('rk')"}

7、更新数据
更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加

7.1 更新数据值
把 test 表中 rowkey 为 rk1 的 base_info 列族下的列 name 修改为 liang

1
hbase(main):030:0> put 'test', 'rk1', 'base_info:name', 'liang'

8、删除数据和表

8.1 指定 rowkey 以及列名进行删除
删除 test 表 row key 为 rk1,列标示符为 base_info:name 的数据

1
hbase(main):002:0> delete 'test', 'rk1', 'base_info:name'

8.2 指定 rowkey,列名以及时间戳信息进行删除
删除 test 表 row key 为 rk1,列标示符为 base_info:name 的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
scan 'test', {COLUMNS => 'base_info', RAW => true, VERSIONS => 3}
ROW COLUMN+CELL
rk1 column=base_info:name, timestamp=1600660633870,
value=zhao
rk1 column=base_info:name, timestamp=1600660627447,
value=li
rk1 column=base_info:name, timestamp=1600660619655,
value=wang
hbase(main):033:0> delete 'test', 'rk1', 'base_info:name',1600660619655
hbase(main):023:0> scan 'test', {COLUMNS => 'base_info', RAW => true, VERSIONS
=> 3}
ROW COLUMN+CELL
rk1 column=base_info:name, timestamp=1600660633870,
value=zhao
rk1 column=base_info:name, timestamp=1600660627447,
value=li
rk1 column=base_info:name, timestamp=1600660619655,
type=Delete
rk1 column=base_info:name, timestamp=1600660619655,
value=wang
1 row(s) in 0.0070 seconds

8.3 删除列族
删除 base_info 列族

1
2
hbase(main):001:0>
hbase(main):035:0> alter 'test', 'delete' => 'base_info'

8.4 清空表数据

1
hbase(main):001:0> truncate 'test'

8.5 删除表

1
2
3
4
5
#disable 再drop
hbase(main):036:0> disable 'test'
hbase(main):037:0> drop 'test'
#如果不进行disable,直接drop会报错
ERROR: Table user is enabled. Disable it first.