快速部署HBase高可用集群

简介

  • HBaseHadoop的数据库,1个开源的、分布式的、面向列、可伸缩的大数据存储。
  • HBaseHadoop之上提供了类似于Google Bigtable的能力。
  • HBase不同于一般的关系数据库,它是适合于非结构化数据存储的数据库,另1个不同的是HBase基于列的而不是基于行的模式。

环境

网址

  • NTP服务:《传送门》
  • HBase传送门
  • JDKHadoopHBase的兼容性:《传送门》

版本

  • OSCentOS 7.7Ubuntu 16.04
  • JDK1.8
  • Hadoop3.2.1
  • Zookeeper3.6.1
  • HBase2.2.4

节点

主机名 IP 应用
cluster-hadoop-01 172.18.20.3 HadoopZooKeeper
cluster-hadoop-02 172.18.20.4 HadoopZooKeeper
cluster-hadoop-03 172.18.20.5 HadoopZooKeeper

部署

基础

1
2
3
4
5
6
# 打开文件数量限制
echo '* soft nofile 204800' >> /etc/security/limits.conf
echo '* hard nofile 204800' >> /etc/security/limits.conf
# 打开进程数量限制
echo '* soft nproc 204800' >> /etc/security/limits.conf
echo '* hard nproc 204800' >> /etc/security/limits.conf

Hadoop

HBase

  • Apache下载最新版本的HBase二进制文件。
  • 解压到指定目录:
1
tar -zxf hbase-2.2.4-bin.tar.gz -C /opt/
  • 创建软连接:
1
ln -sf /opt/hbase-2.2.4 /opt/hbase
  • 环境变量:
1
2
3
4
5
echo '' >> /etc/profile
echo '# HBase Home' >> /etc/profile
echo 'export HBASE_HOME="/opt/hbase"' >> /etc/profile
echo 'export PATH="${PATH}:${HBASE_HOME}/bin"' >> /etc/profile
source /etc/profile
  • 更改目录权限:
1
2
chown -R root:root /opt/hbase
chown -R root:root /opt/hbase-2.2.4

HA模式

  • 创建工作目录:
1
2
3
4
5
6
7
8
9
10
11
# PID目录
mkdir -p /var/run/hbase
echo 'd /var/run/hbase 0770 root root' > /usr/lib/tmpfiles.d/hbase.conf

# 日志目录
mkdir -p /data/hbase/log
echo 'd /data/hbase/log 0770 root root' >> /usr/lib/tmpfiles.d/hbase.conf

# 临时目录
mkdir -p /data/hbase/tmp
echo 'd /data/hbase/tmp 0770 root root' >> /usr/lib/tmpfiles.d/hbase.conf
  • 软链接hdfs-site.xml
1
2
ln -sf /opt/hadoop/etc/hadoop/core-site.xml /opt/hbase/conf/
ln -sf /opt/hadoop/etc/hadoop/hdfs-site.xml /opt/hbase/conf/
  • 删除冲突的lib库:
1
rm -f /opt/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar
  • 编辑hbase-site.xml
1
vim /opt/hbase/conf/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
35
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hdfs-cluster/hbase</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/data/hbase/tmp</value>
</property>

<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>

<property>
<name>hbase.zookeeper.quorum</name>
<value>cluster-hadoop-01,cluster-hadoop-02,cluster-hadoop-03</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data/zookeeper/data</value>
</property>
</configuration>
  • 编辑regionservers
1
vim /opt/hbase/conf/regionservers
1
2
3
cluster-hadoop-01
cluster-hadoop-02
cluster-hadoop-03
  • 编辑backup-masters
1
echo 'cluster-hadoop-02' > /opt/hbase/conf/backup-masters
  • 编辑hbase-env.sh
1
2
3
4
5
6
echo 'export JAVA_HOME="/opt/jdk"' >> /opt/hbase/conf/hbase-env.sh
echo 'export HBASE_MANAGES_ZK=false' >> /opt/hbase/conf/hbase-env.sh
echo 'export HADOOP_HOME="/opt/hadoop"' >> /opt/hbase/conf/hbase-env.sh
echo 'export HBASE_CLASSPATH=".:${HADOOP_HOME}/etc/hadoop"' >> /opt/hbase/conf/hbase-env.sh
echo 'export HBASE_PID_DIR="/var/run/hbase"' >> /opt/hbase/conf/hbase-env.sh
echo 'export HBASE_LOG_DIR="/data/hbase/log"' >> /opt/hbase/conf/hbase-env.sh
  • 拷贝HBase到其他节点:
1
2
rsync -azPS --delete /opt/hbase-2.2.4 cluster-hadoop-02:/opt/
rsync -azPS --delete /opt/hbase-2.2.4 cluster-hadoop-03:/opt/
  • 启动HBase服务:
1
2
# cluster-hadoop-01
/opt/hbase/bin/start-hbase.sh

测试

CLI

  • 进入Shell命令行:
1
hbase shell
  • 获取版本信息:
1
2
hbase(main):001:0> version
2.2.4, r67779d1a325a4f78a468af3339e73bf075888bac, 2020年 03月 11日 星期三 12:57:39 CST
  • 查看集群节点信息:
1
2
hbase(main):002:0> status
1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load

Web

  • HBase提供了Web管理界面:
    • 地址:https://<External IP>:16010

排错

问题描述

  • 无法启动HBase服务,查看日志为UnknownHostException: hdfs-cluster

解决过程

  • 查看Master节点的日志:
1
vim /data/hbase/log/hbase-root-master-cluster-hadoop-01.log
1
2
2020-05-01 00:44:41,911 ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
java.lang.IllegalArgumentException: java.net.UnknownHostException: hdfs-cluster
  • Hadoop的配置文件软链接到HBase中:
1
2
ln -sf /opt/hadoop/etc/hadoop/core-site.xml /opt/hbase/conf/
ln -sf /opt/hadoop/etc/hadoop/hdfs-site.xml /opt/hbase/conf/
  • 检查hdfs-site.xml
1
2
3
4
5
6
7
<configuration>
<!-- 此处不显示声明为<nameservicer id>也会导致报错 -->
<property>
<name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>

问题描述

  • 启动或使用HBase服务时,有如下提示信息:
1
2
3
4
5
6
running master, logging to /var/log/hbase/hbase-root-master-cluster-hadoop-01.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hbase-2.2.4/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.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]

解决过程

  • 其实提示很清楚,设置的Class Path中有多个SLF4J的绑定,只需移除其中1个即可。
1
rm -f /opt/hbase-2.2.4/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar

问题描述

  • 进入HBase Shell后,查看集群节点信息,有如下错误:
1
2
3
4
5
hbase(main):002:0> status

ERROR: KeeperErrorCode = NoNode for /hbase/master

For usage try 'help "status"'

解决过程

  • 查询HadoopHA集群是否正常:
1
jps
  • 查询ZooKeeper的集群是否正常:
1
2
3
echo stat | nc cluster-hadoop-01 2181
echo stat | nc cluster-hadoop-02 2181
echo stat | nc cluster-hadoop-03 2181

请作者喝瓶肥宅快乐水