Zookeeper集群安装与实现Hadoop HA机制

安装前zookeeper前的准备工作

为了安装zookeeper集群与实现hadoop ha机制,准备工作如下

  • Hadoop集群的规模不小于3台,集群中的服务器个数为奇数。因为要进行ZooKeeper的选举,如果集群的节点数是偶数,选举就无法进行。我使用五台虚拟机进行模拟集群,分别命名为master,master0,slave1,slave2,slave3。具体如何安装虚拟机见文:
    https://blog.csdn.net/qq_44320146/article/details/104995085
  • 集群节点任务规划:我的规划是把 master 和 master0 将担任主节点NameNode的角色。slave、slave1 和 salve2 将担任从节点DataNode的角色。
  • 准备jdk,zookeeper,hadoop的安装包,实现 master 主机上的时间同步,Linux系统下的网络配置,防火墙关闭,以及Java环境的安装。完成后,克隆此虚拟机,得到 master0 ,slave1,slave2,slave3。每台克隆的节点上都要实现主机名与网络地址的修改,勿忘!
  • 在master上配置免密钥切换,并安装hadoop,配置hadoop环境变量,其他的配置可以先暂时不配置,等安装好zookeeper后再进行配置也不迟。

上述工作主要目的是完成五个虚拟机组成的集群,配置完成后安装zookeeper。

安装zookeeper

  1. 在Apache官方网站下载ZooKeeper的安装包,解压安装在用户目录/home/hadoop下即可。

  2. 配置环境变量
    /home/hadoop
    vim ~/.bash_profile
    export ZOOKEEPER_HOME=/home/hadoop/ZooKeeper-3.4.5
    export PATH=$ ZOOKEEPER_HOME/bin:$PATH
    source ~/.bash_profile

  3. 配置ZooKeeper的属性文件
    cd /home/hadoop/ZooKeeper-3.4.5/conf
    cp zoo_sample.cfg zoo.cfg
    vim zoo.cfg 打开ZooKeeper的属性配置文件,对以下几项进行配置。
    dataDir=/home/hadoop/ZooKeeper-3.4.5/data
    !注意 data目录需要自己创建

    server.1=master:2888:3888
    server.2=master0:2888:3888
    server.3=slave1:2888:3888
    server.4=slave2:2888:3888
    server.5=slave3:2888:3888

    ZooKeeper 的属性配置文件配置结束。以上关于5台服务器 IP 和端口号的配置形式为server.X=A:B:C。其中,X代表Server的序号,A代表Server的IP地址或者主机名,B代表各个Follower与Leader通信时所用的端口,C代表选举Leader时一起用的端口。

  4. 配置ZooKeeper的服务器序号
    配置主节点的服务器序号如下所示。根据zoo.cfg配置文件中dataDir的内容所指向的目录来配置服务器的序号。
    4.1 cd /home/hadoop/ZooKeeper-3.4.5/data //进入该目录
    4.2 vim myid /新建myid文件
    4.3 输入1 //将myid文件的值设置为1,与上面 server.1=master:2888:3888保持一致,或者使用echo>>1 myid命令实现。

  5. 将ZooKeeper-3.4.5及.bash_profile 复制到master0、slave3、slave1、slave2

    scp -r /home/hadoop/zookeeper-3.4.14 hadoop@master0:~/
    scp -r /home/hadoop/zookeeper-3.4.14 hadoop@slave1:~/
    scp -r /home/hadoop/zookeeper-3.4.14 hadoop@slave2:~/
    scp -r /home/hadoop/zookeeper-3.4.14 hadoop@slave3:~/

    scp -r ~/.bash_profile hadoop@master0:~/
    scp -r ~/.bash_profile hadoop@slave1:~/
    scp -r ~/.bash_profile hadoop@slave2:~/
    scp -r ~/.bash_profile hadoop@slave3:~/

    #ssh登录到master0节点,操作命令如下:
    ssh master0
    source ~/.bash_profile //使配置文件.bash_profile生效
    cd /home/hadoop/ZooKeeper-3.4.5/data
    vim myid //打开myid文件2//将其值修改为2,与zoo.cfg文件中server.2=master0:2888:3888保持一致
    随后 slave1,slave2,slave3同理。

  6. 启动ZooKeeper集群
    使用编写的脚本启动zookeeper集群,使用之前要给脚本可执行权限
    chmod 744 zkmanager.sh

    zkmanager.sh用于启动zookeeper集群

    #!/bin/bash
    for host in master master0 slave1 slave2 slave3
    do
    echo “${host}:$1ing…”
    ssh $host “source ~/.bash_profile;/home/hadoop/zookeeper-3.4.14/bin/zkServer.sh $1”
    echo “----------------------------------------------------------------------------”
    done

    命令参数为start,stop,status

  7. 格式化ZooKeeper集群
    格式化ZooKeeper集群的命令是在主节点master或者master0的执行目录中执行的: bin/hdfszkfc -formatZK。
    一定要在之前安装好hadoop,并配置好路径。
    zkCli.sh –server master:2181 #登录到ZooKeeper集群中,查看HA的hadoop-ha是否生成。输入ls -l若出现hadoop.ha则成功。

配置Hadoop

之前已经配置过hadoop相关路径之后,这步可以省略了。
(事先声明,以下配置以本机配置为例,具体配置需要看情况修改)

  1. core-site.xml
<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://cluster1</value>
	</property>
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/home/hadoop/hadoopdata</value>
	</property>
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>master:2181,master0:2181,slave1:2181,slave2:2181,slave3:2181</value>
	</property>
</configuration>

  1. hdfs-site.xml
<configuration>
	<property>
		<name>dfs.replication</name>
		<value>2</value>
	</property>

	<property>
		<name>dfs.permissions</name>
		<value>false</value>
	</property>

	<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
	</property>

	<property>
		<name>dfs.nameservices</name>
		<value>cluster1</value>
	</property>

	<property>
		<name>dfs.ha.namenodes.cluster1</name>
		<value>master,master0</value>
	</property>

	<property>
		<name>dfs.namenode.rpc-address.cluster1.master</name>
		<value>master:9000</value>
	</property>

	<property>
		<name>dfs.namenode.http-address.cluster1.master</name>
		<value>master:50070</value>
	</property>

	<property>
		<name>dfs.namenode.servicerpc-address.cluster1.master</name>
		<value>master:53310</value>
	</property>

	<property>
		<name>dfs.namenode.rpc-address.cluster1.master0</name>
		<value>master0:9000</value>
	</property>

	<property>
		<name>dfs.namenode.http-address.cluster1.master0</name>
		<value>master0:50070</value>
	</property>

	<property>
		<name>dfs.namenode.servicerpc-address.cluster1.master0</name>
		<value>master0:53310</value>
	</property>

	<property>
		<name>dfs.ha.automatic-failover.enabled.cluster1</name>
		<value>true</value>
	</property>

	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://master:8485;master0:8485;slave1:8485;slave2:8485;slave3:8485/cluster1</value>
	</property>

	<property>
		<name>dfs.client.failover.proxy.provider.cluster1</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>

	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/home/hadoop/hadoopdata/journal</value>
	</property>

	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>

	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/home/hadoop/.ssh/id_rsa</value>
	</property>

	<property>
		<name>dfs.ha.fencing.ssh.connect-timeout</name>
		<value>10000</value>
	</property>

	<property>
		<name>dfs.namenode.handler.count</name>
		<value>100</value>
	</property>

</configuration>
  1. mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
</configuration>

  1. yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>master</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.resourcemanager.address</name>
		<value>master:18040</value>
	</property>
	<property>
		<name>yarn.resourcemanager.scheduler.address</name>
		<value>master:18030</value>
	</property>
	<property>
		<name>yarn.resourcemanager.resource-tracker.address</name>
		<value>master:18025</value>
	</property>
	<property>
		<name>yarn.resourcemanager.admin.address</name>
		<value>master:18141</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address</name>
		<value>master:18088</value>
	</property>

	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
</configuration>

  1. 配置文件slaves
    slaves文件用来指定在集群中哪些节点是DataNode的角色,从本次HA搭建的集群规划中可以看到,slave、slave1、slave2都是DataNode节点的角色。
    vim /home/ydh/hadoop-2.5.2/etc/Hadoop/slaves
    输入
    slave1
    slave2
    slave3

6.分发到各个节点
将master节点配置好的hadoop分别复制到master0、slave3、slave1、slave2节点,操作命令如下:

scp -r /home/hadoop/hadoop-2.5.2 hadoop@master0:~/

scp -r /home/hadoop/hadoop-2.5.2 hadoop@slave1:~/

scp -r /home/hadoop/hadoop-2.5.2 hadoop@slave2:~/

scp -r /home/hadoop/hadoop-2.5.2 hadoop@slave3:~/

登录到各个节点上
vim /home/hadoop/.bash_profile
export HADOOP_HOME=/home/hadoop/hadoop-2.5.2 
export PATH=$ HADOOP_HOME/bin: $ HADOOP_HOME/sbin:$PATH
source /home/hadoop/.bash_profile
  1. 我启动时碰到的问题
    其实讲道理,配置到现在就已经配置好了。但是下面启动集群出现的一个bug让我想了好久才解决。现在想想我还是太菜了,竟然直接想start-all.sh启动hadoop!
    事情是这样的,当时我正准备先格式化主节点hdfs,然后直接一马平川start-all.sh启动hadoop集群。结果hdfs没有成功,给我报了这个错:
 hdfs-site.xml:117:1: XML document structures must start and end within the same entit                                                         y.
20/04/12 07:04:37 FATAL conf.Configuration: error parsing conf hdfs-site.xml
org.xml.sax.SAXParseException; systemId: file:/home/hadoop/hadoop-2.5.2/etc/hadoop/hdfs-site.xml; l                                                         ineNumber: 117; columnNumber: 1; XML document structures must start and end within the same entity.
vim /home/hadoop/hadoop-2.5.2/etc/hadoop/hdfs-site.xml


 Call From master/192.168.93.140 to master:8485 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
        at org.apache.hadoop.hdfs.qjournal.client.QuorumException.create(QuorumException.java:81)
        at org.apache.hadoop.hdfs.qjournal.client.QuorumCall.rethrowException(QuorumCall.java:223)
        at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.hasSomeData(QuorumJournalManager.java:232)
        at org.apache.hadoop.hdfs.server.common.Storage.confirmFormat(Storage.java:875)
        at org.apache.hadoop.hdfs.server.namenode.FSImage.confirmFormat(FSImage.java:171)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:922)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1354)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473)

我一脸懵逼,然后找报错原因。网上说是core-site.xml配置有问题,要给ipc配置参数,我试了,还是没用,甚至还差点把虚拟机搞崩。然后我又很蠢的尝试start-all.sh启动集群…结果,肯定没成功,还卡那半天…
我只好先关机,直到晚上我看到这篇文章:

Hadoop HA使用中遇到的坑
https://blog.csdn.net/qq_14814971/article/details/76736571?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158669285619724843361558%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158669285619724843361558&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-blog_SOOPENSEARCH-4

看完我才恍然大悟! 原来是启动顺序出现了问题,第一次集群启动步骤应该如下:
1.每个节点启动zookeeper服务,执行zkServer.sh start,jps可以看到多了QuorumPeerMain进程
2.每个节点启动journalnode,执行hadoop-daemon.sh start journalnode,jps可以看到多了
JournalNode进程
3.之后再格式化HDFS,在一个master上执行hdfs namenode -format,如果看到succesfully formated就表示成功了(注意不要重复格式化)

第一次启动(血与泪的教训)
一定要先启动zookeeper zkServer.sh start
在启动journalnode hadoop-daemon.sh start journalnode
再在master节点 格式化hdfs hdfs namenode -format
在master master0启动 hadoop-daemon.sh start zkfc
master节点 hadoop-daemon.sh start namenode
再格式化master0 hdfs namenode -bootstrapStandby
master0 节点 hadoop-daemon.sh start namenode
第一次启动(血与泪的教训)
一定要先启动zookeeper zkServer.sh start
在启动journalnode hadoop-daemon.sh start journalnode
再在master节点 格式化hdfs hdfs namenode -format
在master master0启动 hadoop-daemon.sh start zkfc
master节点 hadoop-daemon.sh start namenode
再格式化master0 hdfs namenode -bootstrapStandby
master0 节点 hadoop-daemon.sh start namenode
第一次启动(血与泪的教训)
一定要先启动zookeeper zkServer.sh start
在启动journalnode hadoop-daemon.sh start journalnode
再在master节点 格式化hdfs hdfs namenode -format
在master master0启动 hadoop-daemon.sh start zkfc
master节点 hadoop-daemon.sh start namenode
再格式化master0 hdfs namenode -bootstrapStandby
master0 节点 hadoop-daemon.sh start namenode

重要的事情说三遍!

最后,再到3个slave1,2,3上启动datanode节点hadoop-daemon.sh start datanode(3遍),就可以将整个hadoop+zookeeper集群启动啦!

Hadoop HA机制的实现

  1. 格式化ActiveNameNode
    HDFS分布式文件系统,一般需要在主节点格式化。此时有两个主节点 master 和 master0,可以选择其中任意一个,这里我选择准备担任ActiveNameNode角色的节点master来格式化。#cluster1就是我们在hdfs-site.xml中配置的HDFS文件系统的入口地址。
    hdfs namenode -format -clusterId cluster1
  2. 启动ZooKeeperFailoverController
    出现故障时,ZooKeeperFailoverController用来切换master和master0节点上的NameNode,将StandbyNameNode切换为ActiveNameNode,要实现HA机制,就需要在master和master0两个节点上都来启动这个进程。
    hadoop-daemon.sh start zkfc
    master,master0节点都要启动哦
  3. 格式化StandbyNameNode并启动
    ssh master0 #登录到master0节点
    hdfs namenode -bootstrapStandby
    启动节点
    hadoop-daemon.sh start namenode4
    4.最后验证HA机制
    hadoop启动:
    zookeeper启动:实现zookeeper集群启动
    没有宕机master0之前:
    在这里插入图片描述
    在这里插入图片描述
    暂停master0j节点后:
    在这里插入图片描述
    在这里插入图片描述
    重启master0后

在这里插入图片描述
最后验证成功啦!

希望自己的过程与经验能帮到和我一样的初学者小白!
ps 第一次用Markdown写文章,排版不好多多见谅哈~~~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值