[TOC]
1. HBase与hadoop的版本对应关系
搜索:Hadoop version support matrix
下面有一个二维的支持关系表。
hbase 2.X 的版本 至少需要java8的支持:
hbase–hadoop 打对号的是官方测试过的,功能齐全的,可放心使用。
我们只需要使用打对号的即可,不要去尝试使用其他的版本,否则你可能会遇到一些意外的惊喜。
预装的 hadoop集群是3.1.1版本,这里Hbase选择 2.2.x版本
软件下载地址:
archive.apache.org/dist/hbase/
Hbase官方文档:hbase.apache.org/book.html
2. 前提条件
2.1 Zookeeper正常部署
首先保证Zookeeper集群的正常部署,并启动:
zkServer.sh start
2.2 Hadoop正常部署
Hadoop集群的正常部署并启动:
#启动 zookeeper:
192.168.1.91/92/93
zkServer.sh start
192.168.1.81:(具体 SSH 免密功能的主机)
# 启动hdfs集群
start-dfs.sh
81\82:
hdfs --daemon start zkfc
# 启动 yarn
81:
start-yarn.sh
JobHistory 启动
在 JosHistory 节点 192.168.115.82:
mapred --daemon start historyserver
mapred --daemon stop historyserver
http://192.168.115.82:19888/jobhistory
jps
[hadoop@hadoop81 data]$ which jps
/data/jdk1.8.0_241/bin/jps
[hadoop@hadoop81 sbin]$ xcall '/data/jdk1.8.0_241/bin/jps'
============= hadoop81 /data/jdk1.8.0_241/bin/jps =============
21862 DFSZKFailoverController
22967 Jps
22333 ResourceManager
20718 NameNode
============= hadoop82 /data/jdk1.8.0_241/bin/jps =============
20242 ResourceManager
20755 Jps
20600 JobHistoryServer
19389 NameNode
20031 DFSZKFailoverController
============= hadoop91 /data/jdk1.8.0_241/bin/jps =============
21185 Jps
19989 DataNode
20775 NodeManager
19421 QuorumPeerMain
20077 JournalNode
============= hadoop92 /data/jdk1.8.0_241/bin/jps =============
19827 JournalNode
20532 NodeManager
20935 Jps
19739 DataNode
19164 QuorumPeerMain
============= hadoop93 /data/jdk1.8.0_241/bin/jps =============
20883 Jps
20469 NodeManager
19159 QuorumPeerMain
19687 DataNode
19775 JournalNode
3. 安装HBase
3.1 部署软件
上传HBase软件,并解压
cd /data
tar zxvf /data/soft/hbase-2.2.3-bin.tar.gz
ln -sf hbase-2.2.3 hbase
xcall mkdir /data/logs/hbase
环境变量
vi ~/.bash_profile
export JAVA_HOME=/data/jdk1.8.0_261
export HADOOP_HOME=/data/hadoop
export HBASE_HOME=/data/hbase
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HBASE_HOME/bin:$HADOOP_HOME/sbin:/data/zookeeper/bin:$PATH
source ~/.bash_profile
hbase version
3.2 配置hbase-env.sh
在所有节点上配置:
$ cd /data/hbase/conf
$ vi hbase-env.sh
在文件尾加入:
export JAVA_HOME=/data/jdk1.8.0_241
export HBASE_MANAGES_ZK=false
export HADOOP_HOME=/data/hadoop
export HBASE_MASTER_OPTS="-server -Xms1G -Xmx1G -Xmn400m -Xss228k -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:+DisableExplicitGC -XX:HeapDumpPath=/data/logs/hbase -XX:ErrorFile=/data/logs/hbase/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/data/logs/hbase/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m ${HBASE_MASTER_OPTS}"
export HBASE_REGIONSERVER_OPTS="-server -Xms1G -Xmx1G -Xmn400m -Xss228k -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/hbase -XX:ErrorFile=/data/logs/hbase/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/data/logs/hbase/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m ${HBASE_REGIONSERVER_OPTS}"
export HBASE_SHELL_OPTS="-server -Xms1G -Xmx1G -Xmn400m -Xss228k -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/hbase -XX:ErrorFile=/data/logs/hbase/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/data/logs/hbase/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m ${HBASE_SHELL_OPTS}"
3.3 配置hbase-site.xml
在所有节点上配置:
$ cd /data/hbase/conf
$ vi hbase-site.xml
<configuration>
<!-- 这个目录是region服务器共享的目录,用来持久存储HBase的数据,
默认值为:${hbase.tmp.dir}/hbase,如果不修改这个配置,数据将会在集群重启时丢失。 -->
<property>
<name>hbase.rootdir</name>
<!-- hadoop引入JQM负载均衡时,这里配置dfs.nameservices指定的集群逻辑名称 -->
<value>hdfs://cluster1/hbase</value>
<!-- 指定Hadoop master服务器的写法,hbase监听hdfs默认的端口是9000,这里的配置端口只能写9000 -->
<!--<value>hdfs://hadoop81:9000/hbase</value>-->
</property>
<!-- 指定hbase集群为分布式集群 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zookeeper集群,有多个用英文逗号分隔 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop91:2181,hadoop92:2181,hadoop93:2181</value>
</property>
<!-- 备份的副本数(不会放在同一节点上),不能超过datanode的节点数。 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- Zookeeper元数据快照的存储目录(需要和Zookeeper的zoo.cfg 配置文件中的属性一致) -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data/zookeeper/data</value>
</property>
<!-- 指定HBase Master web页面访问端口,默认端口号16010 -->
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
<!-- 指定HBase RegionServer web页面访问端口,默认端口号16030 -->
<property>
<name>hbase.regionserver.info.port</name>
<value>16030</value>
</property>
<!-- 解决启动HMaster无法初始化WAL的问题 -->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
3.4 backup-masters的配置
backup-masters文件包含应运行备份Master实例的每个节点的列表。除非主用主实例不可用,否则备份主实例将处于空闲状态。
根据我们的架构, 需要将hadoop82配置为备用master。 集群操作就是:在/data/hbase/conf/目录下创建一个名为back-masters文件。然后将hadoop82的IP或者域名写进去。
$ cd /data/hbase/conf
$ vi back-masters
hadoop82
3.5 regionservers的配置
regionservers文件中包含应在集群中运行RegionServer的节点的列表
这些节点需要安装HBase,并且需要使用与主服务器相同的conf /目录内容
$ cd /data/hbase/conf
$ vi regionservers
hadoop91
hadoop92
hadoop93
3.6 HDFS客户端配置
hadoop引入JQM负载均衡机制需要把Hadoop的core-site.xml和hdfs-site.xml两个文件拷贝到HBASE的配置文件目录中
cp /data/hadoop/etc/hadoop/hdfs-site.xml /data/hbase/conf/
cp /data/hadoop/etc/hadoop/core-site.xml /data/hbase/conf/
在$ {HBASE_HOME}/conf下添加hdfs-site.xml(或hadoop-site.xml)或更佳的符号链接的副本
3.7 分发HBASE安装目录
192.168.115.81:
xsync /data/hbase-2.2.3
xsync /home/hadoop/.bash_profile
xcall 'mkdir /data/logs/hbase'
xcall 'rm -f /data/hbase'
xcall 'ln -sf /data/hbase-2.2.3 /data/hbase'
xcall '/data/hbase/bin/hbase version'
4. 启停Hbase
在 Master上输入
192.168.115.81:
start-hbase.sh
stop-hbase.sh
xcall '$JAVA_HOME/bin/jps'
单独启动Hbase master:
hbase-daemon.sh start master
hbase-daemon.sh stop master
启停Regionserver(91/92/93)
hbase-daemons.sh start regionserver
hbase-daemons.sh stop regionserver
hbase-daemon.sh start regionserver
hbase-daemon.sh stop regionserver
5. 各主机的角色
| 节点 | 角色 |
|---|---|
| hadoop81 | ============= hadoop81 /data/jdk1.8.0_241/bin/jps ============= 20833 DFSZKFailoverController 21265 ResourceManager 23816 Jps 20457 NameNode 21627 HMaster |
| hadoop82 | ============= hadoop82 /data/jdk1.8.0_241/bin/jps ============= 20193 JobHistoryServer 19446 DFSZKFailoverController 19638 ResourceManager 22119 Jps 19291 NameNode 20365 HMaster |
| hadoop91 | ============= hadoop91 /data/jdk1.8.0_241/bin/jps ============= 21760 Jps 19573 QuorumPeerMain 19797 JournalNode 19709 DataNode 20349 HRegionServer 20095 NodeManager |
| hadoop92 | ============= hadoop92 /data/jdk1.8.0_241/bin/jps ============= 20274 HRegionServer 19732 JournalNode 20036 NodeManager 21719 Jps 19498 QuorumPeerMain 19644 DataNode |
| hadoop93 | ============= hadoop93 /data/jdk1.8.0_241/bin/jps ============= 19537 QuorumPeerMain 19825 JournalNode 20120 NodeManager 21832 Jps 19737 DataNode 20366 HRegionServer |
6. 访问地址:
hbase shell
status
http://192.168.115.81:16010
http://192.168.115.82:16010
http://192.168.115.91:16030
http://192.168.115.92:16030
http://192.168.115.93:16030
[hadoop@hadoop81 conf]$ hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/hadoop-3.1.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/hbase-2.2.3/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]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.2.3, r6a830d87542b766bd3dc4cfdee28655f62de3974, 2020年 01月 10日 星期五 18:27:51 CST
Took 0.0068 seconds
hbase(main):001:0> status
1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load
Took 1.6550 seconds
7. 问题
7.1 问题一
[hadoop@hadoop81 ~]$ start-hbase.sh
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/hadoop-3.1.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/hbase-2.2.3/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]
running master, logging to /data/hbase/logs/hbase-hadoop-master-hadoop81.out
hadoop92: running regionserver, logging to /data/hbase/bin/../logs/hbase-hadoop-regionserver-hadoop92.out
hadoop93: running regionserver, logging to /data/hbase/bin/../logs/hbase-hadoop-regionserver-hadoop93.out
hadoop91: running regionserver, logging to /data/hbase/bin/../logs/hbase-hadoop-regionserver-hadoop91.out
hadoop82: running master, logging to /data/hbase/bin/../logs/hbase-hadoop-master-hadoop82.out
将低版本的slf4j去掉
$ cd /data/hadoop-3.1.1/share/hadoop/common/lib/
$ mv slf4j-log4j12-1.7.25.jar slf4j-log4j12-1.7.25.jar.bak
8.HMaster主从切换演练
81:(手动停掉Current Active Master: hadoop81)
hbase-daemon.sh stop master
观察http://192.168.115.82:16010/变化(此时82角色由Backup Master>>>Master)
启动81观察81
hbase-daemon.sh start master
此时81HMaster角色转化为Backup Master hadoop81
截图略
至此HBase分布式集群部署及HMaster主从切换演练结束。