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、MapReduce和YARN三个分支构成;
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中进行。
现在就可以动手开始搭建啦~~
在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都像下面一样的结果即正确。
(这里安装的是个绿色版,解压就能用)
`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里面的东西:
完成后关闭集群
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`
这里本人用到的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.cfg
改 dataDir=/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
命令:
service iptables stop
chkconfig iptables off
date
命令查看机子当前的时间。
时间不能差太大,否则集群启动后某些进程跑不起来。
若时间不同步,怎么办?
A. yum进行时间同步器的安装
yum -y install ntp
B. 执行同步命令
ntpdate time1.aliyun.com
和阿里云服务器时间同步
cat /etc/sysconfig/network
查看HOSTNAME是否正确
cat /etc/hosts
查看IP映射是否正确
若不正确,可以改文件,也可以把node01上的用scp分发过去。
cat /etc/sysconfig/selinux
里是否SELINUX=disabled
service iptables status
查看防火墙是否关闭
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
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
验证一下可否免密钥登录
xshell 中选择全部会话输入:zkServer.sh start
接着用命令zkServer.sh status
查看每个zookeeper节点的状态
注意:如果启动不起来,请把/etc/profile里的JAVA_HOME改成绝对路径。
在01、02、03三台机子上分别把journalnode启动起来
hadoop-daemon.sh start journalnode
用jps
检查下进程启起来了没,出现journalnode进程即为成功!
随意挑一台namenode上执行hdfs namenode –format
这里我在node01上进行格式化。
另一台namenode不用执行,否则clusterID变了,找不到集群了。
然后,启动刚刚格式化的那台namenode
hadoop-daemon.sh start namenode
我们要给另一台namenode同步一下数据,node02上进行以下命令
hdfs namenode -bootstrapStandby
hdfs zkfc -formatZK
在node02上执行zkCli.sh打开zookeeper客户端 ls /
看hadoop-ha是否打开
在node01上启动hdfs集群start-dfs.sh
注意:如果那个节点没起来到hadoop目录下去看那个node的日志文件log
然后全部会话jps看一下4台机子,都起来些什么进程,像下面这些就表示你成功啦!加油o( ̄▽ ̄)o
测试一下,如果你像以下结果图一样,node01active状态,node02为standby状态,即正确。
接下来就可以关闭集群了,命令:
stop-dfs.sh
关闭zookeeper命令:zkServer.sh stop
注意:下一次启动hdfs集群的时候不需要用hadoop-daemon.sh start journalnode命令启动journalnode,
只要start-dfs.sh
就可以了。我们之前启动journalnode是为了同步两个namenode之间的信息。
把mapred-site.xml.template留个备份,并且改下名字
cp mapred-site.xml.template mapred-site.xml
<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:
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即正确
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
g、配置完成,最后关闭集群:
node01: stop-dfs.sh
node01: stop-yarn.sh (停止nodemanager)
node03,node04: yarn-daemon.sh stop resourcemanager
Node02、03、04:zkServer.sh stop
将下面三个文件夹放到一个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,大功告成!!!大家敲命令的时候一定要仔仔细细哦,可以避免很多不必要的错误~