文章目录
安装前准备
兼容性
1)与 Zookeeper
的兼容性问题,越新越好,
Apache HBase ™ Reference Guide 官方回答:What version of ZooKeeper should I use?
The newer version, the better. ZooKeeper 3.4.x is required as of HBase 1.0.0
2)与 JDK
的兼容性问题,链接:hbase.apache.org/book.html#basic.prerequisites
HBase Version | JDK 6 | JDK 7 | JDK 8 | JDK 11 |
---|---|---|---|---|
HBase 2.3+ | ❌ | ❌ | ✅ | ❗ |
HBase 2.0-2.2 | ❌ | ❌ | ✅ | ❌ |
HBase 1.2+ | ❌ | ✅ | ✅ | ❌ |
HBase 1.0-1.1 | ❌ | ✅ | ❗ | ❌ |
HBase 0.98 | ✅ | ✅ | ❗ | ❌ |
HBase 0.94 | ✅ | ✅ | ❌ | ❌ |
3)与 Hadoop
的兼容性问题,链接:Apache HBase ™ Reference Guide
Hadoop Version | HBase-2.3.x | HBase-2.4.x | HBase-2.5.x |
---|---|---|---|
Hadoop-2.10.[0-1] | ✅ | ✅ | ❌ |
Hadoop-2.10.2+ | ✅ | ✅ | ✅ |
Hadoop-3.1.0 | ❌ | ❌ | ❌ |
Hadoop-3.1.1+ | ✅ | ✅ | ❌ |
Hadoop-3.2.[0-2] | ✅ | ✅ | ❌ |
Hadoop-3.2.3+ | ✅ | ✅ | ✅ |
Hadoop-3.3.[0-1] | ✅ | ✅ | ❌ |
Hadoop-3.3.2+ | ✅ | ✅ | ✅ |
- ✅ = 经过测试,功能齐全
- ❌ = 已知功能不全
- ❗ = 未测试
官方网址
下载地址:Index of /dist/hbase (apache.org)
官方文档:Apache HBase ™ Reference Guide
中文文档:Hbase 中文文档
集群搭建
因为我的 Hadoop
是 3.3.1
版本的,所以这里选择的是 HBase-2.4.16
版本搭建集群
搭建 Hadoop 集群
没有搭建可以参考:hadoop完全分布式搭建-CSDN博客
保证 Hadoop
集群的正常启动
./myhadoop.sh start
搭建 Zookeeper 集群
没有搭建可以参考:ZooKeeper 集群搭建-CSDN博客
保证 Zookeeper
集群的正常启动
./zk.sh start
解压缩安装
1)解压 Hbase
,并重命名
tar -zxvf hbase-2.4.16-bin.tar.gz -C /opt/
2)配置环境变量
vim /etc/profile.d/hbase.sh
添加如下内容:
# HBASE_HOME
export HBASE_HOME=/opt/hbase-2.4.16
export PATH=$PATH:$HBASE_HOME/bin
3)使用 source
更新环境变量
source /etc/profile
配置文件
1)hbase-env.sh
vim $HBASE_HOME/conf/hbase-env.sh
修改内容:可以直接在第一行按 o
粘到第二行,也可以加到最后:
1)添加 JAVA_HOME、HADOOP_HOME
环境变量;
2)让 Hbase
使用一个现有的不被 Hbase
托管的 Zookeep
集群;
3)将堆设置为 4GB
(而不是默认值 1GB
);
4)禁用 Hadoop
的类路径查找功能,类路径的查找可能会引发问题或冲突。
export JAVA_HOME=/usr/java/default
export HBASE_MANAGES_ZK=false
export HBASE_HEAPSIZE=4G
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP=true
2)hbase-site.xml
vim $HBASE_HOME/conf/hbase-site.xml
修改成如下内容:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value>
<description>The directory shared by RegionServers.
</description>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:9000/hbase</value>
<description>The directory shared by RegionServers.
</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
<description>The mode the cluster will be in. Possible values are
false: standalone and pseudo-distributed setups with managed ZooKeeper
true: fully-distributed with unmanaged ZooKeeper Quorum (see hbase-env.sh)
</description>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
3)regionservers
vim $HBASE_HOME/conf/regionservers
在此文件中列出将运行 RegionServers
的节点
hadoop102
hadoop103
hadoop104
4)【选做,如果 hadoop 没有这个包就不需要做】解决 HBase
和 Hadoop
的 log4j
兼容性问题,将 Hadoop
的 jar
包复制到 HBase
的 jar
包
cp $HADOOP_HOME/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar
cp $HADOOP_HOME/share/hadoop/common/lib/slf4j-api-1.7.30.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-api-1.7.30.jar
mv $HBASE_HOME/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar.bak
mv $HBASE_HOME/lib/client-facing-thirdparty/slf4j-api-1.7.33.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-api-1.7.33.jar.bak
高可用配置
在 HBase
中 HMaster
负责监控 HRegionServer
的生命周期,均衡 RegionServer
的负载,如果 HMaster
挂掉了,那么整个 HBase
集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以 HBase
支持对 HMaster
的高可用配置。
1)在 conf
目录下创建 backup-masters
文件
touch $HBASE_HOME/conf/backup-masters
2)在 backup-masters
文件中配置高可用 HMaster
节点
echo hadoop103 > $HBASE_HOME/conf/backup-masters
分发 HBase 文件
xsync $HBASE_HOME/
服务的启停
1)单点启动/停止服务
$HBASE_HOME/bin/hbase-daemon.sh start master
$HBASE_HOME/bin/hbase-daemon.sh start regionserver
$HBASE_HOME/bin/hbase-daemon.sh stop master
$HBASE_HOME/bin/hbase-daemon.sh stop regionserver
2)集群启动/停止服务
$HBASE_HOME/bin/start-hbase.sh
$HBASE_HOME/bin/stop-hbase.sh
启动顺序
zookeepeer➡hadoop➡hbase
./zk.sh start
./myhadoop.sh start
start-hbase.sh
停止顺序
hbase➡hadoop➡zookeepeer
stop-hbase.sh
./myhadoop.sh stop
./zk.sh stop
验证进程
HQuorumPeer
进程是一个 ZooKeeper
实例,由 HBase
控制和启动。如果没有使用自己的 Zookeeper
,而是使用 Hbase
托管的, 那么每个集群节点只能使用一个实例,并且仅适用于测试。
QuorumPeerMain
进程是 Zookeeper
独立的进程, ZooKeeper
在 HBase
之外运行。
有关 ZooKeeper
配置的更多信息,包括使用 HBase
的外部ZooKeeper
实例,查看 zookeeper 文档。
hadoop102、hadoop103、hadoop104
jps
Output 至少应该含有以下进程:
./jpsall
=============== hadoop102 ===============
32673 HMaster
33457 Jps
24836 QuorumPeerMain
26555 HRegionServer
=============== hadoop103 ===============
24160 Jps
20241 HRegionServer
21018 HMaster
19709 QuorumPeerMain
=============== hadoop104 ===============
17744 QuorumPeerMain
18084 NodeManager
21260 Jps
查看 Web 端页面
默认情况下,它部署在主服务器的端口 16010
上(HBase RegionServer
默认情况下监听端口 16020
,并在端口 16030
上放置一个信息 HTTP
服务器)。如果 Master
在默认端口上名为 hadoop102
的服务器上运行,将浏览器指向 hadoop102:16010 以查看 Web
界面。
同时在 HDFS
上也会创建一个 hbase
目录
HBase
启动后,可以查阅 shell exercises,了解如何创建表,添加数据,扫描插入,最后禁用和删除表。
# 进入 HBase 客户端命令行
hbase shell
HBase 搭建过程中常见问题
进程问题
HQuorumPeer 和 QuorumPeerMain 区别
HQuorumPeer
进程是一个 ZooKeeper
实例,由 HBase
控制和启动。如果没有使用自己的 Zookeeper
,而是使用 Hbase
托管的, 那么每个集群节点只能使用一个实例,并且仅适用于测试。
QuorumPeerMain
进程是 Zookeeper
独立的进程, ZooKeeper
在 HBase
之外运行。
HRegionServer
stop-hbase.sh
可能没有关闭 HRegionServer
进程,需要自己关闭
/opt/hbase-2.4.16/bin/hbase-daemon.sh stop regionserver
# 或者 jps 查看进程号,使用 kill -9 杀死进程
HMaster 自动关闭
- 检查 HDFS 的端口
hbase-site.xml
中的hbase.rootdir
的主机和端口号必须和core-site.xml
中的fs.defaultFS
的保持一致,即主机相同且端口统一使用8020
或者9000
。
- 检查 ZooKeeper:
ZooKeeper
集群不稳定或者不可用:HMaster
依赖于ZooKeeper
进行状态管理和协调,如果ZooKeeper
出现问题,可能会影响到HMaster
的运行。
- 检查网络和防火墙设置:
- 确保
HBase Master
能够通过网络与其他节点(包括ZooKeeper
)通信。检查网络连接和防火墙设置,确保必要的端口是开放的。
- 确保
- 检查网络:
- 网络中断或不稳定:
HMaster
需要与ZooKeeper、RegionServers
和其他服务保持稳定的网络连接。网络问题可能导致HMaster
无法正常工作并自动关闭。
- 网络中断或不稳定:
启动顺序
zookeepeer➡hadoop➡hbase
./zk.sh start
./myhadoop.sh start
start-hbase.sh
停止顺序
hbase➡hadoop➡zookeepeer
stop-hbase.sh
./myhadoop.sh stop
./zk.sh stop
无法关闭一直等待
单点关闭,去日志里查找问题,日志里会提供关于问题的更多详细信息和上下文。
$HBASE_HOME/bin/hbase-daemon.sh stop master
$HBASE_HOME/bin/hbase-daemon.sh stop regionserver
运行报错
ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet
at org.apache.hadoop.hbase.master.HMaster.checkServiceStarted(HMaster.java:2815)
at org.apache.hadoop.hbase.master.MasterRpcServices.isMasterRunning(MasterRpcServices.java:1163)
at org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:387)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:132)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:369)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:349)
- 等待 Master 启动完成:
HBase Master
启动可能需要一些时间。如果你刚刚启动了Master
,可能需要等待一段时间让它完全启动并注册到ZooKeeper
中。
- 检查 HBase Master 状态:
- 确认
HBase Master
进程是否在运行。你可以通过查看系统进程(例如使用jps
命令)或者检查HBase
的日志文件来确定Master
的状态。
- 确认
- 检查 HBase 和 ZooKeeper 配置:
- 确保
HBase
和ZooKeeper
的配置文件中的地址、端口和其他设置都是正确的。任何错误的配置都可能导致Master
无法启动或者无法与ZooKeeper
正确通信。
- 确保
- 检查网络和防火墙设置:
- 确保
HBase Master
能够通过网络与其他节点(包括ZooKeeper
)通信。检查网络连接和防火墙设置,确保必要的端口是开放的。
- 确保
- 查看日志文件:
- 查看
HBase
和ZooKeeper
的日志文件,它们可能会提供关于问题的更多详细信息和上下文。
- 查看
日志中报错问题
无法调用方法
报错信息如下:
WARN [RS-EventLoopGroup-1-1] concurrent.DefaultPromise: An exception was thrown by org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper$4.operationComplete()
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.hbase.io.asyncfs.ProtobufDecoder.<init>(ProtobufDecoder.java:64)
......
解决方案:
1)使用 Hadoop
的 jar
包替换 hbase
的 jar
包,并将 hbase
的 jar
包备份
cp $HADOOP_HOME/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar
cp $HADOOP_HOME/share/hadoop/common/lib/slf4j-api-1.7.30.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-api-1.7.30.jar
mv $HBASE_HOME/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar.bak
mv $HBASE_HOME/lib/client-facing-thirdparty/slf4j-api-1.7.33.jar $HBASE_HOME/lib/client-facing-thirdparty/slf4j-api-1.7.33.jar.bak
2)修改 hbase-env.sh
vim $HBASE_HOME/conf/hbase-env.sh
禁用 Hadoop
的类路径查找功能,类路径的查找可能会引发问题或冲突。
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP=true
3)重新启动 hbase
集群
stop-hbase.sh
start-hbase.sh
启动 HBase 无法找到 Hadoop 本机库
报错信息如下:
WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable