Hadoop HA高可用集群搭建详细过程(亲测四台有效)

北战南征 提交于 2020-08-05 18:49:28

hadoop集群HA高可用搭建
❀❀❀❀❀搭建前的简单介绍❀❀❀❀❀
主机配置环境如下表:
在这里插入图片描述
Hadoop HA原理:
   在一典型的HA集群中,每个NameNode是一台独立的服务器。在任一时刻,只有一个NameNode处于active状态,另一个处于standby状态。其中,active状态的NameNode负责所有的客户端操作,standby状态的NameNode处于从属地位,维护着数据状态,随时准备切换(两种切换方式,选择手动切换和自动切换)。手动切换是通过命令实现主备之间的切换,可以用HDFS升级等场合,自动切换方案基于Zookeeper。两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。




HA集群的架构图
在这里插入图片描述
将四台机子node01,node02,node03,node04,按如下HA安装方案图进行集群规划。
HA安装方案图
在这里插入图片描述
*表示虚拟机要配置该角色




hadoop 2.X介绍
 Hadoop 2.x由HDFS、MapReduceYARN三个分支构成;
 HDFS:NN Federation(联邦)、HA;
 2.X:只支持2个节点HA,3.0实现了一主多从
 MapReduce:运行在YARN上的MR;
   离线计算,基于磁盘I/O计算
 YARN:资源管理系统
作用:
 a.解决HDFS 1.0中单点故障和内存受限问题。
 b.解决单点故障
   HDFS HA:通过主备NameNode解决
   如果主NameNode发生故障,则切换到备 NameNode上
 c.解决内存受限问题
   HDFS Federation(联邦)
   水平扩展,支持多个NameNode;
 (1)每个NameNode分管一部分目录;
 (2)所有NameNode共享所有DataNode存储资源















xftp和xshell介绍:
  xftp 是一个基于 MS windows 平台的功能强大的SFTP、FTP 文件传输软件。
  xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。
 本人安装了xshell5.0和Xftp-4.0。在搭建过程中,使用xshell连接4台虚拟机,进行命令操作,这样十分方便,免去了鼠标在windows和linux之间来回切换的不便性。
xftp传输文件页面如下(左右两边文件可互传):在这里插入图片描述



准备工作:
 开启node01,node02,node03,node04四台虚拟机,4台虚拟机之间可以互相访问(可ping通),root用户登录。
在这里插入图片描述
开启虚拟机出现虚拟机繁忙问题解决办法:
 当你启动虚拟机时,虚拟机卡住或者关不掉虚拟机的情况,可以试试重启一下你的计算机,如果还是无法解决的话,接下来可以win+R,输入msconfig命令,重新启动一下VMware相关的五项服务。
在这里插入图片描述
在这里插入图片描述





xshell连接上四台虚拟机,接下来的命令都在xshell中进行。
在这里插入图片描述

现在就可以动手开始搭建啦~~

一、搭建集群

1、软件安装

1.1 安装jdk

在node01上用rpm装jdk,命令如下:

-rpm -i jdk-7u67-linux-x64.rpm
-whereis java
-vi + /etc/profile
	export JAVA_HOME=/usr/bin/java
	export PATH=$PATH:$JAVA_HOME/bin
-source /etc/profile

运行图如下:
在这里插入图片描述在这里插入图片描述
👍提示:如果出现 -bash: jps: command not found
改:export JAVA_HOME=/usr/bin/java
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin
修改后jps出来如下图所示,则结果正常
在这里插入图片描述
分发jdk到node02、03、04,命令如下:






-scp jdk-7u67-linux-x64.rpm node02:`pwd`
-scp jdk-7u67-linux-x64.rpm node03:`pwd`
-scp jdk-7u67-linux-x64.rpm node04:`pwd`

在node02、03、04分别安装jdk,命令如下:

-rpm -i jdk-7u67-linux-x64.rpm

在node01上cd /etc,在此目录下把profile文件分发到node02、03、04上。

scp profile node02:`pwd`

利用Xshell全部会话栏,source /etc/profile
利用Xshell全部会话栏,jps,看04、05、06这三台机子的jdk是否装好。04,05,06都像下面一样的结果即正确。
在这里插入图片描述

1.2 安装hadoop2.6.5

(这里安装的是个绿色版,解压就能用)

1.2.1 在node01上安装hadoop

`tar xf hadoop-2.6.5.tar.gz -C /opt/nj` (注:-C的C 是大写)

然后到/opt/nj目录下去看一下是否解压好了

cd /opt/nj/hadoop-2.6.5

其中sbin这个文件夹很重要,放的是系统级别的一些可执行脚本
修改hadoop配置文件信息

cd /opt/nj/hadoop-2.6.5/etc/hadoop

注:以上路径的etc可不是根目录下的etc
在这里插入图片描述
给这三个文件里的JAVA_HOME都改成绝对路径/usr/java/jdk1.7.0_67
在这里插入图片描述
修改hadoop配置文件信息
配置命令 vi core-site.xml 结果图如下:
在这里插入图片描述
配置命令 vi hdfs-site.xml 结果图如下:
在这里插入图片描述
配置slaves文件(localhost改为node01 )








格式化hdfs(只能格式化一次,再次启动集群不要执行,否则clusterID变了)
在这里插入图片描述
在这里插入图片描述
当像运行结果图中显示successfully,即成功
(之前/var/nj/hadoop/pseudo这个文件不存在,格式化后就存在了,要记得检查一下看存在没)



接下来启动集群
start-dfs.sh,并用jps验证下都有哪些进程启动起来了。
在这里插入图片描述
在浏览器里打开node01:50070(☺别用360浏览器哦!推荐firefox),如下图:
在这里插入图片描述
try
创建目录hdfs dfs -mkdir -p /user/root
更新网页,可以在utilities下的browse directory中发现创建成功的目录。
在这里插入图片描述
上传文件命令: hdfs dfs -put a.txt /user/root
在这里插入图片描述
🎨hadoop的log查法:
cd到hadoop-2.6.5(我用的Hadoop版本)
ll查看
在这里插入图片描述
可以进一步查看logs里面的东西:
在这里插入图片描述
完成后关闭集群
在这里插入图片描述

















1.2.2 修改namenode的一些配置信息,分发到node02、03、04

A.vi hdfs-site.xml
去掉snn的配置

 <property>
              <name>dfs.namenode.secondary.http-address</name>
          	  <value>node01:50090</value>
 </property>

增加以下property

<property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>node01:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>node01:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:50070</value>
</property>

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/nj/hadoop/ha/jn</value>
</property>


<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/root/.ssh/id_dsa</value>
</property>

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

B.vi core-site.xml
增加以下property

<!– 集群名称mycluster-->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<!– zookeeper布署的位置-->
<property>
   <name>ha.zookeeper.quorum</name>
   <value>node02:2181,node03:2181,node04:2181</value>
</property>

C.vi slaves
增加以下内容

node02
node03
node04

D.安装hadoop
cd /opt ,将其下的nj目录分发到node02、03、04

scp –r  nj/ node02:`pwd`
scp –r  nj/ node03:`pwd`
scp –r  nj/ node04:`pwd`

将hdfs-site.xml和core-site.xml分发到node02、03、04

scp hdfs-site.xml core-site.xml node02:`pwd`
scp hdfs-site.xml core-site.xml node03:`pwd`
scp hdfs-site.xml core-site.xml node04:`pwd`

1.3 安装zookeeper

这里本人用到的zookeeper版本为zookeeper-3.4.6

在node02上用以下命令操作,装在node02,03,04
a.解压安装zookeeper

tar xf zookeeper-3.4.6.tar.gz -C /opt/nj

ll看看也没有software,没有,创建一个目录mkdir software
b.修改zookeeper的配置文件

cd /opt/nj/zookeeper-3.4.6/conf

ll看看也没有zoo_sample.cfg,给zoo_sample.cfg改名

cp zoo_sample.cfg zoo.cfg

vi zoo.cfgdataDir=/var/nj/zk
并在末尾追加
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
其中2888主从通信端口,3888是当主挂断后进行选举机制的端口




c.把zookeeper分发到其他节点

cd /opt/nj
scp -r zookeeper-3.4.6/ node03:`pwd`
scp -r zookeeper-3.4.6/ node04:`pwd`

并用ll /opt/nj检查下看分发成功没
存在zookeeper-3.4.6即为成功

d.给每台机子创建刚配置文件里的路径

mkdir -p /var/nj/zk

对node02来说:

echo 1 > /var/nj/zk/myid
cat /var/nj/zk/myid

对node03来说:

echo 2 > /var/nj/zk/myid
cat /var/nj/zk/myid

对node04来说:

echo 3 > /var/nj/zk/myid
cat /var/nj/zk/myid

e.在/etc/profile里面配置

export ZOOKEEPER_HOME=/opt/nj/zookeeper-3.4.6
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

f.然后在把/etc/profile分发到其他node03、node04

scp /etc/profile node03:/etc
scp /etc/profile node04:/etc

在node02、03、04里source /etc/profie,☆这步千万别忘
验证source这句是否完成,输入zkCli.s,按Tab可以把名字补全zkCli.sh

2、 关闭防火墙

命令:

service iptables stop
chkconfig iptables off

3、 同步所有服务器的时间

date 命令查看机子当前的时间。
时间不能差太大,否则集群启动后某些进程跑不起来。
若时间不同步,怎么办?
A. yum进行时间同步器的安装
yum -y install ntp
在这里插入图片描述
B. 执行同步命令
ntpdate time1.aliyun.com 和阿里云服务器时间同步






4、配置文件检查

cat /etc/sysconfig/network

查看HOSTNAME是否正确

cat /etc/hosts

查看IP映射是否正确
若不正确,可以改文件,也可以把node01上的用scp分发过去。
cat /etc/sysconfig/selinux里是否SELINUX=disabled
service iptables status查看防火墙是否关闭


5、免秘钥设置

5.1 NN与其他三台机子的免秘钥设置

NN node01免秘钥处理命令:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

过程如下图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
ssh localhost 验证 (别忘了exit)
ssh node01验证(别忘了exit)
在这里插入图片描述
把node01的公钥发给其他三台机子




scp  id_dsa.pub   node02:`pwd`/node01.pub
scp  id_dsa.pub   node03:`pwd`/node01.pub
scp  id_dsa.pub   node04:`pwd`/node01.pub

在node01上分别ssh node02 ; ssh node03 ; ssh node04,看是否能免密钥登录,每次ssh都别忘了exit !!!
在这里插入图片描述
在node04的.ssh目录下看是否有node01.pub
如果有,那就追加到authorized_keys
在这里插入图片描述
并且在node01上ssh node02看是否免密钥了,记得exit
给node03、04都追加一下node01.pub,也就是在node03、04的.ssh目录下执行cat node01.pub >> authorized_keys





5.2 两个NN间互相免密钥

node01与node02间互相免密钥: node01可免密钥登录node02,那现需node02上能免密钥登node01,所以
在node02上:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ssh localhost

验证一下
分发到node01上:scp id_dsa.pub node03:pwd/node04.pub
在node01的.ssh目录下,cat node02.pub >> authorized_keys,
在node02上ssh node03验证一下可否免密钥登录


6、启动zookeeper

xshell 中选择全部会话输入:zkServer.sh start
接着用命令zkServer.sh status查看每个zookeeper节点的状态
注意:如果启动不起来,请把/etc/profile里的JAVA_HOME改成绝对路径。

7、启动journalnode

在01、02、03三台机子上分别把journalnode启动起来

hadoop-daemon.sh start journalnode

jps检查下进程启起来了没,出现journalnode进程即为成功!

8、格式化任一namenode

随意挑一台namenode上执行hdfs namenode –format这里我在node01上进行格式化。
另一台namenode不用执行,否则clusterID变了,找不到集群了。
然后,启动刚刚格式化的那台namenode

hadoop-daemon.sh start namenode

9、给另一namenode同步数据

我们要给另一台namenode同步一下数据,node02上进行以下命令

hdfs namenode -bootstrapStandby

10、格式化zkfc

hdfs zkfc -formatZK
在node02上执行zkCli.sh打开zookeeper客户端 ls / 看hadoop-ha是否打开
在这里插入图片描述

11、启动hdfs集群

在node01上启动hdfs集群start-dfs.sh
注意:如果那个节点没起来到hadoop目录下去看那个node的日志文件log
在这里插入图片描述
然后全部会话jps看一下4台机子,都起来些什么进程,像下面这些就表示你成功啦!加油o( ̄▽ ̄)o
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述



12、用浏览器访问node01:50070和node02:50070

测试一下,如果你像以下结果图一样,node01active状态,node02为standby状态,即正确。
在这里插入图片描述在这里插入图片描述

接下来就可以关闭集群了,命令:
stop-dfs.sh
在这里插入图片描述
关闭zookeeper命令:zkServer.sh stop
👍注意:下一次启动hdfs集群的时候不需要用hadoop-daemon.sh start journalnode命令启动journalnode,
只要start-dfs.sh就可以了。我们之前启动journalnode是为了同步两个namenode之间的信息。




13、为MapReduce做准备

把mapred-site.xml.template留个备份,并且改下名字

cp mapred-site.xml.template mapred-site.xml

在这里插入图片描述
在mapred-site.xml里添加如下property

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

rm1,rm2为node03和node04
在yarn-site.xml里添加如下property

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
<property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
 </property>
 <property>
   <name>yarn.resourcemanager.cluster-id</name>
   <value>cluster1</value>
 </property>
 <property>
   <name>yarn.resourcemanager.ha.rm-ids</name>
   <value>rm1,rm2</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm1</name>
   <value>node03</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>node04</value>
 </property>
 <property>
   <name>yarn.resourcemanager.zk-address</name>
   <value>node02:2181,node03:2181,node04:2181</value>
 </property>

把mapred-site.xml和yarn-site.xml 分发到node02、03、04
在这里插入图片描述
显示100%即分发成功

由于node03和node04都是resourcemanager,所以它俩应该相互免密钥

node03上免密钥登录node04:
在node03的.ssh目录下生成密钥
cd .ssh
ssh-keygen -t dsa -P '' -f ./id_dsa
并追加到自己authorized_keys
cat id_dsa.pub >> authorized_keys
ssh localhost验证看是否需要密码,别忘了exit
将node03 的公钥分发到node04
scp id_dsa.pub node04:pwd/node03.pub
在node04的.ssh目录下,追加node03.pub
cat node03.pub >> authorized_keys
在node03上ssh node04,看是否免密钥
node04上免密钥登录node03:
在node04的.ssh目录下生成密钥
cd .ssh
ssh-keygen -t dsa -P '' -f ./id_dsa
并追加到自己authorized_keys
cat id_dsa.pub >> authorized_keys
ssh localhost验证看是否需要密码,别忘了exit
将node04 的公钥分发到node03
scp id_dsa.pub node03:pwd/node04.pub
在node03的.ssh目录下,追加node04.pub
cat node04.pub >> authorized_keys
在node04上ssh node03,看是否免密钥






















都成功后,continue:

14、启动yarn、resourcemanager

a.启动zookeeper,全部会话zkServer.sh start
b.在node01上启动hdfs,start-dfs.sh
c.在node01上启动yarn,start-yarn.sh
d.在node03、04上分别启动resourcemanager,
yarn-daemon.sh start resourcemanager
e.全部会话jps,看进程全不全





在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在浏览器访问node03:8088,查看resourcemanager管理的内容
在这里插入图片描述
Active Nodes值为3即正确

二、测试

跑一个wordcount及运行结果

a.cd /opt/nj/hadoop-2.6.5/share/hadoop/mapreduce
b.在hdfs里建立输入目录和输出目录
hdfs dfs -mkdir -p /data/in
hdfs dfs -mkdir -p /data/out
c.将要统计数据的文件上传到输入目录并查看
hdfs dfs -put ~/500miles.txt /data/in
hdfs dfs -ls /data/in
d. 运行wordcount(注意:此时的/data/out必须是空目录






hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/in /data/out/result

出现如下红色圈内部分语句,就表示你快成功了!👍
在这里插入图片描述
e.打开网址node03:8088,查看
在这里插入图片描述SUCCEEDED成功了!👍


f.查看运行结果
命令:

hdfs dfs -ls /data/out/result 
hdfs dfs -cat /data/out/result/part-r-00000

运行结果:
在这里插入图片描述
在这里插入图片描述
至此,hadoop高可用集群搭建完毕。


g、配置完成,最后关闭集群:
node01: stop-dfs.sh
node01: stop-yarn.sh (停止nodemanager)
node03,node04: yarn-daemon.sh stop resourcemanager
Node02、03、04:zkServer.sh stop



三、在Windows下配置hadoop的环境

将下面三个文件夹放到一个usr文件夹里,把usr放到一个你知道的地方。
在这里插入图片描述
“此电脑”右键-属性-高级系统设置
更改环境变量,增加HADOOP_HOME
在这里插入图片描述
并且给path后追加HADOOP_HOME的bin目录
在这里插入图片描述
然后再新建一个变量HADOOP_USER_NAME
在这里插入图片描述
把hadoop.dll拷贝到以下路径
from:
在这里插入图片描述
to:
在这里插入图片描述
安装ecipse-mars,此版本的eclipse带插件,可以可视化的看到hadoop的一些东西,比较方便
在这里插入图片描述
在这里插入图片描述
如果eclipse界面下方没有小象图标,则做后续三步调出
在这里插入图片描述在这里插入图片描述
在eclipse里把hadoop相关信息填一下
在这里插入图片描述
新建一个hadoop localtion
在这里插入图片描述
设置
起一个Location name,不要勾选Use M/R Master host
Host:查一下哪个namenode是active就填哪个(我是node01)
在这里插入图片描述
这样在eclipse左侧列表的DFS location里
新建一个目录,对应hdfs里也就建好了,可以用浏览器查看一下。



























在eclipse里导入自己建一个包库
在这里插入图片描述
把jar包导入刚建的包库
在这里插入图片描述
把刚建的包库引入到project里
在这里插入图片描述
把JUnit包库引入到project里
在这里插入图片描述
利用xftp把hdfs-site.xml,core-site.xml等几个xml放到project的src目录
在这里插入图片描述
OK,大功告成!!!大家敲命令的时候一定要仔仔细细哦,可以避免很多不必要的错误~









易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!