环境配置

  • hadoop-2.7.4
  • zookeeper-3.4.10
  • hbase-1.3.1

部署Hadoop集群

jdk版本兼容问题

查询官方文档:
https://hbase.apache.org/book.html#configuration

图1

图2

1
2
3
4
5
6
7
8
9
[ushbase@nosql01 bin]$ jps
3488 HRegionServer
2693 DataNode
2998 ResourceManager
2583 NameNode
3691 HMaster
3851 Jps
2382 QuorumPeerMain
3135 NodeManager

现象

配置完成后 ResourceManager 过一段时间会消失

检查安装目录下日志文件,如”…/hadoop-2.7.4/logs/yarn-ushbase-resourcemanager-nosql01.out”

1
2
3
4
2024-12-06 15:29:56,794 FATAL 
org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Error starting ResourceManager
com.google.inject.internal.util.ComputationException: java.lang.ExceptionInInitializerError
at com.google.inject.internal.util.ComputationException:java.lang.ExceptionInInitializerErroratcom.google.inject.internal.util.MapMakerStrategyImpl.compute(MapMaker.java:553)

解决

此时我使用的是JDK17,于是尝试更换为jdk8

  1. 解压安装jdk8

  2. 打开 Hadoop 的配置文件

(如 .../hadoop-2.7.4/etc/hadoop/hadoop-env.sh)

1
vim hadoop-env.sh
  1. 将里面 JAVA_HOME 设置为新的 Java 安装路径

找到后自行改为解压安装的jdk8路径

1
export JAVA_HOME=
  1. 生效配置更改

自行改为相应文件

1
source hadoop-env.sh

部署Zookeeper

目前良好

HBase完全分布式安装

启动流程

原启动流程

  1. 启动Zookeeper集群

(分别在nosql01,nosql02,nosql03)上 执行.

1
2
[ushbase@nosql01 zookeeper-3.4.10]$ cd bin/
[ushbase@nosql01 bin]$ ./zkServer.sh start

此命令分别在nosql01,nosql02,nosql03节点上启动了QuorumPeerMain

  1. 启动hdfs服务

在nosql01中运行命令:

1
[ushbase@nosql01 bin]$ start-dfs.sh
  1. 启动yarn服务

在nosql01中运行命令:

1
[ushbase@nosql01 bin]$ start-yarn.sh
  1. 启动HBase

在nosql01中输入启动命令并查看进程:

1
[ushbase@nosql01 bin]$ start-hbase.sh
  1. 校验

在网页地址输入nosql01的ip + 端口16010

192.168.10.134:16010

如果能进入网页,说明配置成功.

问题

现象

一直做到第五步都成功

直到进入hbase终端进行数据库操作报错

建表报错

1
2
3
4
5
6
7
8
[ushbase@nosql01 bin]$ hbase shell

hbase(main):001:0> create 'User','address','info','member_id'

ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
at org.apache.hadoop.hbase.master.HMaster.checkInitialized(HMaster.java:2452)
at org.apache.hadoop.hbase.master.HMaster.checkNamespaceManagerReady(HMaster.java:2457)
at org.apache.hadoop.hbase.master.HMaster.ensureNamespaceExists(HMaster.java:2737)

解决1

听说有伙伴使用以下方案重启即可

CSDN解决1

CSDN解决2

本人尝试后仍然失败

解决2

  1. 检查修改配置文件

CSDN解决方案

通过修改hbase配置文件”…/hbase-1.3.1/conf/hbase-site.xml”,

hbase.rootdir改成了hbase.root.dir

1
2
3
4
<property>
<name>hbase.root.dir</name>
<value>hdfs://nosql01:9000/hbase</value>
</property>
  1. 在”…/hbase-1.3.1/conf/hbase-env.sh”文件中加入下面的命令
1
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP=true

尝试后仍然没有成功

解决3

在接着上面的修改下

尝试解决方案3

使用不同的启动hbase方式

4. 启动HBase流程修改加入一步

  1. 先启动regionserver
1
[ushbase@nosql01 bin]$ hbase-daemon.sh start regionserver
  1. 再启动Hbase
1
[ushbase@nosql01 bin]$ start-hbase.sh

出现新的报错

1
ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet

解决4

解决方案4

在”…/hbase-1.3.1/conf/hbase-site.xml”文件中添加以下配置

1
2
3
4
5
6
7
8
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>

重新启动后成功

1
2
3
4
5
6
7
8
hbase(main):001:0> create 'User','address','info','member_id'
0 row(s) in 1.7890 seconds

=> Hbase::Table - User
hbase(main):002:0> list
TABLE
User
1 row(s) in 0.1600 seconds

HBase Shell

删除表中的一个列族前要先disable这张表

hbase(main):029:0> disable ‘User’
0 row(s) in 2.2790 seconds

完全解决

上面方法表面能成功,实际上是只运行了nosql01一台RegionServer,并没有符合原来的设计方案初衷

且后面使用JAVA API仍然不断报错

于是恢复快照到刚安装完HBase时

发现最后真正的问题是

1 用户环境变量

另外两台虚拟机没有写全

注意是在用户ushbase里,
因为root有自己的~/.bash_profile,ushbase也有自己的~/.bash_profile

1
vi ~/.bash_profile 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

# 配置Hadoop系统环境变量
export HADOOP_HOME=/opt/servers/hbase_demo/hadoop-2.7.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 添加Zookeeper的环境变量
export ZK_HOME=/opt/servers/hbase_demo/zookeeper-3.4.10
export PATH=$PATH:$ZK_HOME/bin

# 配置Hbase环境变量
export HBASE_HOME=/opt/servers/hbase_demo/hbase-1.3.1
export PATH=$PATH:$HBASE_HOME/bin

2 防火墙端口

通过查看日志文件hbase-ushbase-master-nosql01.log

偶然发现nosql02:16020和nosql03:16020出现很频繁报错

1
2
org.apache.hadoop.hbase.ipc.FailedServerException: This server is in the failed servers list: nosql02/192.168.10.135:16020
org.apache.hadoop.hbase.ipc.FailedServerException: This server is in the failed servers list: nosql03/192.168.10.136:16020

于是在另外两台虚拟机添加端口

1
2
3
4
5
6
7
[root@nosql02 ~]# systemctl start firewalld
[root@nosql02 ~]# firewall-cmd --add-port=16020/tcp
success
[root@nosql02 ~]# firewall-cmd --query-port=16020/tcp
yes
[root@nosql02 ~]# systemctl stop firewalld
[root@nosql02 ~]#
1
2
3
4
5
6
7
[root@nosql03 ~]# systemctl start firewalld
[root@nosql03 ~]# firewall-cmd --add-port=16020/tcp
success
[root@nosql03 ~]# firewall-cmd --query-port=16020/tcp
yes
[root@nosql03 ~]# systemctl stop firewalld
[root@nosql03 ~]#

用jps命令查看在运行的进程,若没有关机过,那就重启hbase完事

1
2
3
[ushbase@nosql01 bin]$ stop-hbase.sh
stopping hbase................
[ushbase@nosql01 bin]$ start-hbase.sh

继续尝试终端

1
[ushbase@nosql01 bin]$ hbase shell

成功

1
2
3
4
5
hbase(main):001:0> list
TABLE
0 row(s) in 0.3630 seconds

=> []