大数据环境搭建-HBase和Zookeeper

前言

推荐HBase版本2.1.10。

特点

  • 是一种面向列族存储的非关系型数据库。
  • 用于存储结构化和非结构化的数据 适用于单表非关系型数据的存储,不适合做关联查询,类似 JOIN 等操作。
  • 基于HDFS,数据持久化存储的体现形式是 HFile,存放于 DataNode 中, 被 ResionServer 以 region 的形式进行管理。

  • 延迟较低,接入在线业务使用。

通过JPS查看进程

Master可能的进程:

进程名 是否必须 所属 说明
HMaster 必须 Hbase 表明该Hbase是Master
HRegionServer 非必须 Hbase 因为我们也将该Master设置为Region
QuorumPeerMain 必须 Zookeeper 单独配置的Zookeeper集群,如果是内置的则为HQuorumPeer
NameNode 必须 Hadoop Hadoop NameNode
SencondNameNode 必须 Hadoop 任务调度器

HRegion可能的进程:

进程名 是否必须 所属 说明
HRegionServer 必须 Hbase 表明是Hbase存储节点
QuorumPeerMain 必须 Zookeeper 单独配置的Zookeeper集群,如果是内置的则为HQuorumPeer
DataNode 必须 Hadoop 数据存储

部署模式

HBase的部署方式包括:

部署模式 说明
单机模式(支持Windows) 常用于本地开发
伪集群模式(不支持Windows) 使用HBase自带的zookeeper
集群模式(不支持Windows) 使用HBase自带的zookeeper
集群模式(不支持Windows) 单独安装zookeeper

HBase的安装

本文的HBase安装是在Hadoop已经安装好的基础上实现的,所以之前要导出JAVA_HOME、HADOOP_HOME( 单机模式不需要,伪分布式模式和分布式模式需要)等环境变量以及配置好SSH互信等。

下载地址

https://archive.apache.org/dist/hbase/2.1.10/

image-20221214135054992

安装

1
2
3
mkdir -p /data/tools/bigdata/
tar -zxvf hbase-2.1.10-bin.tar.gz -C /data/tools/bigdata/
cd /data/tools/bigdata/hbase-2.1.10

环境变量

环境变量

1
cd /etc/profile.d/

创建配置文件

1
vi /etc/profile.d/hbase.sh

内容设置为

1
2
3
# HBase
export HBASE_HOME=/data/tools/bigdata/hbase-2.1.10
export PATH=$PATH:$HBASE_HOME/bin

配置生效

1
source /etc/profile

查看是否生效

1
echo $HBASE_HOME

查看hbase版本 :

1
hbase version

环境变量分发

1
2
ha-fenfa.sh /etc/profile.d/hbase.sh
ha-call.sh "source /etc/profile"

HBase的配置

单机模式

配置hbase-env.sh 在hbase-env.sh添加如下内容

1
2
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export HBASE_MANAGES_ZK=true

说明:

其中

HBASE_MANAGES_ZK=true,表示由hbase自己管理zookeeper,不需要单独的zookeeper

HBASE_MANAGES_ZK=false则表示使用独立部署的zookeeper。

配置hbase-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>

<property>
<name>hbase.cluster.distributed</name>
<value>false</value>
</property>

<property>
<name>hbase.zookeeper.quorum</name>
<value>127.0.0.1</value>
</property>

<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>

<property>
<name>hbase.tmp.dir</name>
<value>D:/Tools/bigdata/zdata/hbase/tmp</value>
</property>

<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>D:/Tools/bigdata/zdata/hbase/data</value>
</property>

</configuration>

说明:

hbase.rootdir,用于指定HBase数据的存储位置,因为如果不设置的话,hbase.rootdir默认为/tmp/hbase-${user.name},这意味着每次重启系统都会丢失数据。

此配置中HBase直接使用默认的文件系统。

启动和停止

1
2
$HBASE_HOME/bin/start-hbase.sh
$HBASE_HOME/bin/stop-hbase.sh

伪集群模式

配置hbase-env.sh 在hbase-env.sh添加如下内容

1
2
3
export JAVA_HOME=$JAVA_HOME
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HBASE_MANAGES_ZK=true

export HBASE_MANAGES_ZK=true,表示由hbase自己管理zookeeper,不需要单独的部署zookeeper。

export HBASE_CLASSPATH="", 表示使用hdfs作为HBase的储存。

配置hbase-site.xml

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop01:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>

说明:

base.rootdir,用于指定HBase数据的存储位置,此时已经使用了hdfs。 hbase.cluster.distributed设置集群处于分布式模式;

启动和停止

启动HBase

1
$HBASE_HOME/bin/start-hbase.sh

停止HBase

1
$HBASE_HOME/bin/stop-hbase.sh

启动HDFS

1
$HADOOP_HOME/sbin/start-dfs.sh

停止HDFS

1
$HADOOP_HOME/sbin/stop-dfs.sh

集群模式(内置Zookeeper)

配置hbase-env.sh 在hbase-env.sh添加如下内容

1
2
3
export JAVA_HOME=$JAVA_HOME
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HBASE_MANAGES_ZK=true

HBASE_MANAGES_ZK=true,表示使用hbase自带的zookeeper。

配置hbase-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hdfsns/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>6000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property</name>
<value>/data/tools/bigdata/zdata/zookeeper/data</value>
</property>
</configuration>

说明:

  • base.rootdir 用于指定HBase数据的存储位置;
  • hbase.cluster.distributed 设置集群处于分布式模式;
  • hbase.master 指定hbase的hmaster的主机名和端口 ;
  • base.zookeeper.quorum 指定使用zookeeper的主机地址,必须是奇数个;
  • hbase.zookeeper.property 指定zookeeper数据存储目录,默认路径是/tmp,如果不配置,重启之后数据将被清空。

配置regionservers 在regionservers文件中添加HBase的slave节点,类似hadoop中的slaves,一行一个。

1
2
3
hadoop01
hadoop02
hadoop03

启动和停止 启动(包括启动hdfs和hbase)

1
2
$HBASE_HOME/sbin/start-dfs.sh
$HBASE_HOME/bin/start-hbase.sh

停止(包括停止hbase和hdfs)

1
2
$HBASE_HOME/bin/stop-hbase.sh
$HBASE_HOME/sbin/stop-dfs.sh

HBase启动成功之后:

master节点上的进程有:HMaster

slave节点上的进程有:HRegionServer、HQuorumPerr

集群模式(独立Zookeeper)

Zookeeper参见

https://www.psvmc.cn/article/2022-05-23-bigdata-zookeeper.html

配置

配置hbase-env.sh

1
2
3
export JAVA_HOME=$JAVA_HOME
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HBASE_MANAGES_ZK=false

其中HBASE_MANAGES_ZK=false,表示不使用hbase自带的zookeeper,而使用独立部署的zookeeper。

配置hbase-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hdfsns/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>6000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property</name>
<value>/data/tools/bigdata/zdata/zookeeper/data</value>
</property>
</configuration>

说明:

  • base.rootdir 用于指定HBase数据的存储位置;
  • hbase.cluster.distributed 设置集群处于分布式模式;
  • hbase.master 指定hbase的hmaster的主机名和端口 ;
  • hbase.zookeeper.quorum 指定使用zookeeper的主机地址,必须是奇数个;
  • hbase.zookeeper.property 指定zookeeper数据存储目录,默认路径是/tmp,如果不配置,重启之后数据将被清空。

注意

hbase.zookeeper.quorum中不要添加端口号,否则与Phoenix Query Server集成后Phoenix Query Server无法连接。

配置regionservers 在regionservers文件中添加HBase的slave节点,类似hadoop中的slaves,一行一个。

1
2
3
hadoop01
hadoop02
hadoop03

backup-masters

这个可以不配置

1
hadoop02

backup-masters 这个文件是不存在的,需要新建,主要用来指明备用的 master 节点,可以是多个,这里我们以 1 个为例。

分发

1
2
3
4
5
6
7
8
ha-call.sh "rm -rf $HBASE_HOME/logs/*"
ha-fenfa.sh $HBASE_HOME
ha-fenfa.sh /etc/profile.d/hbase.sh
ssh hadoop02 "source /etc/profile"
ssh hadoop03 "source /etc/profile"

ssh hadoop02 "echo $HBASE_HOME"
ssh hadoop03 "echo $HBASE_HOME"

启动和停止

先启动Zookeeper和Hadoop

启动Hbase

1
$HBASE_HOME/bin/start-hbase.sh

停止Hbase

1
$HBASE_HOME/bin/stop-hbase.sh

HBase启动成功之后:

  • master节点上的进程有:HMaster、QuorumPeerMain

  • slave节点上的进程有:HRegionServer、QuorumPeerMain

说明:hbase的master节点和slave节点中都出现了QuorumPeerMain(就是zookeeper进程)而不是QuorumPeer进程,表示此时hbase使用的是独立的zookeeper。

查看状态

1
ha-call.sh "jps"

访问

HMaster 的 Web 接口

http://192.168.7.101:16010

http://192.168.7.102:16010

HRegionServer 的 Web 接口

http://192.168.7.101:16030

http://192.168.7.102:16030

http://192.168.7.103:16030

管理工具虽然比较简单,但是可以查看集群的一些状态信息

  • HBase 的版本信息
  • HBase 的基本配置信息
  • HBase 在 HDFS 中的存储路径
  • Zookeeper 的节点
  • 集群的负载信息
  • 表、region 和 region server 的信息
  • 可以进行 compat 和 split 操作

报错

Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/htrace/core/HTraceConfiguration

更换为2.1.10解决了,高版本缺少jar

ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper exists failed after 4 attempts

解决方法

Centos上

1
netstat -aon|grep "2181"

Win上

1
2
netstat -aon|findstr "2181"
taskkill /pid 4136 -t -f

HBase的操作

下面的操作主要是在hbase的shell中操作的,进入hbase shell

1
hbase shell

创建表

1
2
3
4
create 'student','s_name','s_sex','s_age','s_dept','s_course'

# 创建表示指定保存的版本数
create 'teacher',{NAME=>'username',VERSIONS=>5}

查看表详情

1
describe 'student'

显示所有的表

1
list

插入数据

1
2
3
4
5
6
7
8
9
put 'student','95001','s_name','LiYing'
put 'student','95001','s_sex','Male'
put 'student','95001','s_course:math','80'
put 'student','95001','s_course:english','90'

put 'student','95002','s_name','XiaoHong'
put 'student','95002','s_sex','Femal'
put 'student','95002','s_course:math','90'
put 'student','95002','s_course:english','70'

注意:一次只能为一个表的一行数据的一个列,也就是一个单元格添加一个数据,所以直接用shell命令插入数据效率很低,在实际应用中,一般都是利用编程操作数据。

当运行命令:put ‘student’,’95001’,’s_name’,’LiYing’时,即为student表添加了学号为95001,名字为LiYing的一行数据,其行键为95001。

查询数据 HBase中有两个用于查看数据的命令:

  1. get命令,用于查看表的某一行数据;
  2. scan命令用于查看某个表的全部数据

示例

1
2
3
4
5
6
7
get 'student','95001'
get 'student','95001','s_course'
get 'student','95001','s_course:math'

scan 'student'

scan 'student', {FORMATTER => 'toString'}

删除数据 在HBase中用delete以及deleteall命令进行删除数据操作,它们的区别是: ① delete用于删除一个数据,是put的反向操作; ② deleteall操作用于删除一行数据。

1
2
delete 'student','95001','s_sex'
deleteall 'student','95001'

修改数据 在添加数据时,HBase会自动为添加的数据添加一个时间戳,故在需要修改数据时,只需直接添加数据,HBase即会生成一个新的版本,从而完成“改”操作,旧的版本依旧保留,系统会定时回收垃圾数据,只留下最新的几个版本,保存的版本数可以在创建表的时候指定。下面是一个操作的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
hbase(main):034:0> get 'student','95001'
COLUMN CELL
s_name: timestamp=1537497681798, value=LiYing
s_sex: timestamp=1537497682400, value=Male
s_course:english timestamp=1537497872225, value=90
s_course:math timestamp=1537497681859, value=80
4 row(s) in 0.0310 seconds

hbase(main):035:0> put 'student','95001','s_course:english','100'
0 row(s) in 0.0130 seconds

hbase(main):036:0> get 'student','95001'
COLUMN CELL
s_name: timestamp=1537497681798, value=LiYing
s_sex: timestamp=1537497682400, value=Male
s_course:english timestamp=1537498062541, value=100
s_course:math timestamp=1537497681859, value=80
4 row(s) in 0.0130 seconds

删除表 删除表有两步,第一步先让该表不可用,第二步删除表。直接drop未disable的表会失败。

1
2
disable 'student'
drop 'student'

查询历史的表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create 'teacher',{NAME=>'username',VERSIONS=>5}

put 'teacher','91001','username','Mary'
put 'teacher','91001','username','Mary1'
put 'teacher','91001','username','Mary2'
put 'teacher','91001','username','Mary3'
put 'teacher','91001','username','Mary4'
put 'teacher','91001','username','Mary5'

get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5}

hbase(main):064:0> get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5}
COLUMN CELL
username: timestamp=1537498459746, value=Mary5
username: timestamp=1537498455244, value=Mary4
username: timestamp=1537498455193, value=Mary3
username: timestamp=1537498455174, value=Mary2
username: timestamp=1537498455149, value=Mary1
5 row(s) in 0.0110 seconds

退出hbase

1
exit

兼容性

兼容性

JDK兼容性

image-20220523145344475

Hadoop兼容性

https://hbase.apache.org/book.html#hadoop

image-20220519161808684

image-20220519173153943

image-20220523145516863

Hbase与 Zookeeper 的关系

HBase 主要用ZooKeeper来实现 HA 选举主备集群主节点的切换系统容错、meta-region 管理Region 状态管理分布式 SplitWAL 任务管理等。

Windows上安装注意点

Could not initialize class org.fusesource.jansi.internal.Kernel32

Hbase在Windows上安装是非常不顺利的

问题1 无法运行

版本上

  • 1.x 安装配置后能够直接运行 但是开发时SBT无法下载依赖

  • 2.x 安装后默认缺少依赖,需要把缺少的jar放到lib目录中