HBase的官方文档十分详细,按照quickstart介绍的步骤安装就可以完成,配置集群版时需要稍微留意一下与hadoop相关的几个配置项。本文记录了自己在某项目集成环境安装HBase集群版的过程。
一、环境信息
> uname -a
Linux node1 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
> java --version
openjdk 11.0.15 2022-04-19
> hbase version
HBase 2.5.1
二、单机版
HBase单机版的安装还是十分简单的。
下载HBase
国内建议用清华镜像比较快:
> wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.5.1/hbase-2.5.1-bin.tar.gz --no-check-certificate
注:下载了几次2.4.15版解压缩时都报unexpected end of file
错误,改为下载2.5.1版。
解压缩到指定目录
这里以安装到/usr/local
为例:
> tar zxvf hbase-2.5.1-bin.tar.gz -C /usr/local/
启动HBase
启动HBase服务,成功后可以看到HMaster进程和HRegionServer进程,浏览器访问 http://localhost:16010 可以进入HBase Web界面,bin/hbase shell
可进入命令行。
> bin/start-hbase.sh
running master, logging to /usr/local/hbase-2.5.1/bin/../logs/hbase-root-master-node1.out
: running regionserver, logging to /usr/local/hbase-2.5.1/bin/../logs/hbase-root-regionserver-node1.out
> jps
55825 HMaster
56062 HRegionServer
> bin/hbase shell
hbase:001:0>
如果提示Could not start ZK at requested port of 2181
,修改hbase-site.xml
设置hbase.cluster.distributed=true
,这样其实HBase的运行模式是伪分布式(而非单机模式),即HMaster与HRegionServer运行在同一物理机的不同jvm进程。
停止HBase
> bin/stop-hbase.sh
停止后用jps
命令确认看HMaster和HRegionServer进程是否已结束。
三、集群版
HBase单机版一般无法支撑生产环境的需要,这里介绍如何在单机版基础上配置集群版,这里以三台服务器为例,其中节点1和节点2作为HMaster(主备),节点1、节点2和节点3同时作为RegionServer。
配置ssh免密
主节点需要能够免密登录到其他节点,备份主节点也需要能够免密登录到其他节点。
> ssh-keygen
> ssh-copy-id root@node2
> ssh-copy-id root@node3
修改hbase-site.xml
HBase默认的hbase-site.xml
内容是单机版配置,只适合测试和学习使用,现在需要改为集群版的配置。一是修改运行模式为集群模式;二是将HBase的数据目录由本地目录改为HDFS目录,其中host和port应参考core-site.xml
里配置的fs.defaultFS
的值:
> vi hbase-site.xml
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode1:8020/hbase</value>
</property>
同时删除单机版需要的hbase.tmp.dir
和hbase.unsafe.stream.capability.enforce
这两个配置项。
此时重新启动HBase后,会自动在hdfs上创建hbase目录:
[root@node1 hbase-2.5.1]# hdfs dfs -ls /hbase
Found 12 items
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/.hbck
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/.tmp
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/MasterData
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/WALs
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/archive
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/corrupt
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/data
-rw-r--r-- 3 hdfs supergroup 42 2022-01-05 13:34 /hbase/hbase.id
-rw-r--r-- 3 hdfs supergroup 7 2022-01-05 13:34 /hbase/hbase.version
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/mobdir
drwxr-xr-x - hdfs supergroup 0 2022-01-05 13:34 /hbase/oldWALs
drwx--x--x - hdfs supergroup 0 2022-01-05 13:34 /hbase/staging
修改regionservers
修改regionservers文件,每行填写一台服务器的名称:
> vi conf/regionservers
node1
node2
node3
创建备份HMaster
生产环境一般需要启动在两个节点上启动HMaster以提供高可用能力。在conf目录下创建backup-masters
文件,里面填写备份HMaster服务器的名称:
> vi conf/backup-masters
node2
配置zookeeper
在hbase-site.xml里配置zookeeper:
> vi hbase-site.xml
<property>
<name>hbase.zookeeper.quorum</name>
<value>node1,node2,node3</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper</value>
</property>
配置从节点
将整个目录复制到其他从节点,我习惯用rsync比较快,如果没有装rsync也可以用scp命令:
> rsync -avr /usr/local/hbase-2.5.1 root@node2:/usr/local
> rsync -avr /usr/local/hbase-2.5.1 root@node3:/usr/local
启动HBase集群
在主节点上启动集群:
> bin/start-hbase.sh
启动后在各节点上执行jps
检查HMaster和HRegionServer进程是否存在,如果启动失败查看日志以便定位原因。
四、常见问题
HMaster启动了,但所有RegionServer都没启动
检查日志文件发现HMaster在等待RegionServer,而RegionServer日志里则没有任何信息。
> tail logs/hbase-root-master-node1.out
2022-01-05 17:36:36,007 INFO [master/zookeeper-2:16000:becomeActiveMaster] master.ServerManager (ServerManager.java:waitForRegionServers(805)) - Waiting on regionserver count=0; waited=862160ms, expecting min=1 server(s), max=NO_LIMIT server(s), timeout=4500ms, lastChange=862160ms
2022-01-05 17:36:37,512 INFO [master/zookeeper-2:16000:becomeActiveMaster] master.ServerManager (ServerManager.java:waitForRegionServers(805)) - Waiting on regionserver count=0; waited=863665ms, expecting min=1 server(s), max=NO_LIMIT server(s), timeout=4500ms, lastChange=863665ms
向前翻日志发现有警告JAVA_HOME没有配置(但在命令行里echo $JAVA_HOME
其实有值),在conf/hbase-env.sh
里再指定一次并重启HBase问题解决。
> vi conf/hbase-env.sh
# The java implementation to use. Java 1.8+ required.
export JAVA_HOME=/home/k2data/jdk-11
RegionServer报错ClockOutOfSyncException
如果主节点与从节点的时钟不同步,RegionServer会报错退出,可以手动更新时间错误的节点。生产环境建议ntpdate或chrony保持时钟同步。
停止HBase服务时提示"no hbase master found"
原因是记录hbase各个服务的pid文件默认放在/tmp目录下,由于某些原因文件丢失了。可以手工在每个节点jps查看hbase服务(H开头的)的进程id,然后kill掉。
SLF4J提示找到多个实现
启动hbase或在hbase shell里执行命令时总是出现如下的slf4j警告提示:
[root@taos-1 target]# start-hbase.sh
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hdfs/hadoop-3.2.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase-2.5.1/lib/client-facing-thirdparty/log4j-slf4j-impl-2.17.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
SLF4J: Class path contains multiple SLF4J bindings.
一般是与hadoop自带的log4j2版本不一致导致的,按提示中的路径删除旧版的log4j2包即可
五、参考链接
https://hbase.apache.org/book.html#quickstart