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

hadoop集群HA高可用搭建
❀❀❀❀❀搭建前的简单介绍❀❀❀❀❀
主机配置环境如下表:
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第1张图片
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集群的架构图
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第2张图片
将四台机子node01,node02,node03,node04,按如下HA安装方案图进行集群规划。
HA安装方案图
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第3张图片
*表示虚拟机要配置该角色

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传输文件页面如下(左右两边文件可互传):Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第4张图片

准备工作:
 开启node01,node02,node03,node04四台虚拟机,4台虚拟机之间可以互相访问(可ping通),root用户登录。
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第5张图片
开启虚拟机出现虚拟机繁忙问题解决办法:
 当你启动虚拟机时,虚拟机卡住或者关不掉虚拟机的情况,可以试试重启一下你的计算机,如果还是无法解决的话,接下来可以win+R,输入msconfig命令,重新启动一下VMware相关的五项服务。
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第6张图片
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第7张图片

xshell连接上四台虚拟机,接下来的命令都在xshell中进行。
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第8张图片

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

一、搭建集群

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

运行图如下:
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第9张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第10张图片
提示:如果出现 -bash: jps: command not found
改:export JAVA_HOME=/usr/bin/java
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin
修改后jps出来如下图所示,则结果正常
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第11张图片
分发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 结果图如下:
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第12张图片
配置命令 vi hdfs-site.xml 结果图如下:
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第13张图片
配置slaves文件(localhost改为node01 )

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

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

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

过程如下图:
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第19张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第20张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第21张图片
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 !!!
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第22张图片
在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
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第23张图片
然后全部会话jps看一下4台机子,都起来些什么进程,像下面这些就表示你成功啦!加油o( ̄▽ ̄)o
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第24张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第25张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第26张图片在这里插入图片描述

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

测试一下,如果你像以下结果图一样,node01active状态,node02为standby状态,即正确。
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第27张图片在这里插入图片描述

接下来就可以关闭集群了,命令:
stop-dfs.sh
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第28张图片
关闭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,看进程全不全

Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第29张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第30张图片
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第31张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第32张图片

在浏览器访问node03:8088,查看resourcemanager管理的内容
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第33张图片
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

出现如下红色圈内部分语句,就表示你快成功了!
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第34张图片
e.打开网址node03:8088,查看
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第35张图片SUCCEEDED成功了!

f.查看运行结果
命令:

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

运行结果:
在这里插入图片描述
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第36张图片
至此,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 HA高可用集群搭建详细过程(亲测四台有效)_第37张图片
“此电脑”右键-属性-高级系统设置
更改环境变量,增加HADOOP_HOME
在这里插入图片描述
并且给path后追加HADOOP_HOME的bin目录
在这里插入图片描述
然后再新建一个变量HADOOP_USER_NAME
在这里插入图片描述
把hadoop.dll拷贝到以下路径
from:
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第38张图片
to:
在这里插入图片描述
安装ecipse-mars,此版本的eclipse带插件,可以可视化的看到hadoop的一些东西,比较方便
在这里插入图片描述
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第39张图片
如果eclipse界面下方没有小象图标,则做后续三步调出
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第40张图片Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第41张图片
在eclipse里把hadoop相关信息填一下
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第42张图片
新建一个hadoop localtion
在这里插入图片描述
设置
起一个Location name,不要勾选Use M/R Master host
Host:查一下哪个namenode是active就填哪个(我是node01)
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第43张图片
这样在eclipse左侧列表的DFS location里
新建一个目录,对应hdfs里也就建好了,可以用浏览器查看一下。

在eclipse里导入自己建一个包库
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第44张图片
把jar包导入刚建的包库
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第45张图片
把刚建的包库引入到project里
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第46张图片
把JUnit包库引入到project里
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第47张图片
利用xftp把hdfs-site.xml,core-site.xml等几个xml放到project的src目录
Hadoop HA高可用集群搭建详细过程(亲测四台有效)_第48张图片
OK,大功告成!!!大家敲命令的时候一定要仔仔细细哦,可以避免很多不必要的错误~

你可能感兴趣的:(大数据,hadoop)