之前的文章已经介绍了如何搭建hadoop集群,以及在hadoop集群之上搭建spark集群。可以点击如下链接查看:
一、centos7+hadoop2.8.0+VMware搭建完全分布式集群
本篇文章记录的是在上述hadoop集群上安装HBase和ZooKeeper的过程,以备后续参考!
软件版本和系统环境
①HBase,1.2.5,下载链接 http://archive.apache.org/dist/hbase/1.2.5/hbase-1.2.5-bin.tar.gz
②ZooKeeper,3.4.8,下载链接 http://archive.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
安装配置ZooKeeper
①将下载的zookeeper压缩包上传到/opt/hadoop目录下并解压(这个目录是自己创建的用来存放相关软件安装包的)
在/opt/hadoop目录下执行解压命令:tar -zxf zookeeper-3.4.8.tar.gz
②进入zookeeper安装包的conf目录下,复制一份zoo_sample.cfg文件到zoo.cfg文件
③配置zoo.cfg
④创建dataDir对应的目录
因为上一步配置了dataDir的目录此时并不存在,因此需要创建。
进入/root/hadoop目录,执行命令:mkdir -p zookeeper/data
⑤进入data文件夹,新建myid文件并且写入“1”
命令:vi myid
⑥配置zookeeper安装目录下的conf文件夹中的日志文件log4j.properites,修改如下两处
⑦bin目录下的zkEnv.sh文件,配置日志路径,修改如下两处
⑧将master节点上配置好的zookeeper文件传到slave1和slave2节点的/opt/hadoop目录下
命令:scp -r ....
⑧像步骤④一样,在slave1和slave2节点分别创建dataDir对应的目录,以及创建并编辑myid文件
区别是,myid文件的内容分别改为“2”和“3”,slave1对应2,slave2对应3
命令:mkdir -p zookeeper/data
⑨在所有机器上分别配置zookeeper环境变量
命令:vi /etc/profile,添加如下两行
⑩在每台机器上都运行zookeeper,并查看状态
下面三张图依次是我的启动顺序,status状态会根据集群启动情况动态选举leader和follower。
jps查看进程,看到所有节点都有QuorumPeerMain进程
注意:zookeeper的启动顺序不需要按照myid值的顺序依次启动。
如果觉得每次启动zookeeper集群都有在所有节点上执行start命令比较麻烦,可以参考下面链接进行设置,这样只需要在master节点的相关目录下执行startzk.sh即可启动集群。
https://blog.csdn.net/loopeng1/article/details/79012989
安装配置HBase
①将hbase压缩包上传到master节点的/opt/hadoop目录下并解压
②配置/opt/hadoop/hbase-1.2.5/conf目录下的一系列文件
主要是配置这三个文件hbase-env.sh、hbase-site.xml和 regionservers
hbase-env.sh
export JAVA_HOME=/opt/java/jdk1.8.0_181
export HBASE_CLASSPATH=/opt/hadoop/hbase-1.2.5
export HBASE_MANAGES_ZK=false(因为要使用自己安装的zookeeper,所以这里设置成false来禁止使用hbase自带的)
export HBASE_PID_DIR=/root/hadoop/pids(这是用来存放pid的目录,需要自己创建)
hbase-site.xml
在<configuration></configuration>中添加如下内容
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<!-- 如果hadoop是HA模式,那么rootdir可以改成对应的名称。同时需要将hadoop的core-site.xml和hdfs-site.xml复制到hbase的conf目录下,否则会报找不到ns1的错误 -->
<!--
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
-->
<!-- 启用分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定独立Zookeeper安装路径 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/hadoop/zookeeper-3.4.8</value>
</property>
<!-- 指定ZooKeeper集群端口 -->
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<!-- 指定Zookeeper集群位置 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>60000000</value>
</property>
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
regionservers
添加节点主机名
③创建pid存放目录
在步骤②中,我们设置了HBASE_PID_DIR=/root/hadoop/pids,但当前并不存在此目录,因此需要手动创建此目录
命令:midir /root/hadoop/pids
④在/etc/profile文件中配置hbase的环境变量
⑤将master节点上配置好的hbase-1.2.5安装包发送到slave1和slave2节点
在/opt/hadoop路径下依次执行下面两行命令
scp -r ./hbase-1.2.5 slave1:/opt/hadoop
scp -r ./hbase-1.2.5 slave2:/opt/hadoop
⑥在master节点上启动hbase
在此之前,先启动hadoop和zookeeper。
在master节点上执行命令:start-hbase.sh来启动hbase,并用jps查看进程
在slave节点查看进程
注意:启动HBase之前应该保证Hadoop集群和zookeeper已经启动,并且在主节点执行start-hbase.sh启动HBase集群,否则HMaster进程将在启动几秒后消失,看日志可能会看的如下错误
zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
而备用的HMaster进程需要在备用主节点单独启动,命令是:./hbase-daemon.sh start master
⑦登录web页面查看
hbase1.0版本以后web默认的端口是16010,也可以自己在hbase.site.xml中设置
输入网址:masterip:16010 即可
hbase安装时遇到的问题汇总:
1.后面在尝试安装2.1.8版本的hbase时,还遇到了下面的错
java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
网上找到解决方法,执行下面的命令即可解决
cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/
2.hbase必须依赖于hdfs,也就是说如果Hadoop集群的DataNode没有启动起来的话,也会导致hmaster启动失败:
ERROR [master/flink1:16000:becomeActiveMaster] master.HMaster: ***** ABORTING master flink1,16000,1576915484267: Unhandled exception. Starting shutdown. *****
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /hbase/.tmp/hbase.version could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.
3.hbase集群高可用安装时,对集群节点的时间差有要求,因此尽可能的保持各节点时间同步,否则可能会报下面的错(时间差超过最大限制时,虽然主节点可以启动hredionserver,但是其他与主节点时间差较大的有可能启动不了),解决时间同步问题可以看这篇:
ERROR [regionserver/flink2:16020] regionserver.HRegionServer: Master rejected startup because clock is out of sync
org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.hadoop.hbase.ClockOutOfSyncException: Server flink2,16020,1576888135093 has been rejected; Reported time is too far out of sync with master. Time difference of 52153513ms > max allowed of 30000ms
4.集群服务起来后,周末两天没管,周一再看web页面的时候看到dead regionserver有好多,regionserver全都死掉了。然后hbase shell中执行一些命令的时候也会报master is initializing的错误,查看master日志看到有下面这句报错:
WARN [master/flink1:16000:becomeActiveMaster] master.HMaster: hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=OPEN, ts=1576939135821, server=flink1,16020,1576769049468}; ServerCrashProcedures=false. Master startup cannot progress, in holding-pattern until region onlined.
网上找了一些,发现解决办法是删除掉zk中对应的hbase路径然后重启hbase即可:
[zk: 172.21.89.128:2181(CONNECTED) 2] ls /
[zookeeper, yarn-leader-election, hbase, hadoop-ha, rmstore]
[zk: 172.21.89.128:2181(CONNECTED) 3] rmr /h
hbase hadoop-ha
[zk: 172.21.89.128:2181(CONNECTED) 3] rmr /hbase
5.启动的时候还有可能报下面的错
The procedure WAL relies on the ability to hsync for proper operation during component failures, but the underlying filesystem does not support doing so.
这可以通过在hbase-site.xml文件中增加以下配置解决
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>