@Hadoop高可用搭建
前期搭建可以通过以下链接学习:
一、如何安装虚拟机与通过克隆在虚拟机里安装四台Linux系统及配置安装
二、伪分布式安装
你好! 本篇文章主要对完全分布式Hadoop集群环境的安装与配置步骤进行介绍。
本文章的特点是,操作详细,在实践过程中出现的错误进行分析,对常见问题进行了解决,希望可以帮到大家。
下面是需要的一些安装文件,需要者自取
[ 提取码:657t ] jdk安装包、Hadoop、xshell、xftp
hostname | idadderess |
---|---|
node01 | NameNode、Jps、JournalNode、DFSZKFailoverController |
node02 | NameNode、Jps、JournalNode、DFSZKFailoverController、DataNode、QuorumPeerMain、NodeManager |
node03 | Jps、JournalNode、DataNode、QuorumPeerMain、NodeManager、ResourceManager |
node04 | Jps、DataNode、QuorumPeerMain、NodeManager、ResourceManager |
1、前期准备
我们首先需要下载虚拟机,同时在虚拟机里面安装四台Linux。方便起见,可以选择先添加一台Linux,配置完成后进行克隆。还需要用到xshell方便操作(这里只简要概述,不具体介绍,具体见前面目录一)
1.1 设置IP :VM:编辑>虚拟网络编辑器
vi etc/sysconfig/network-scripts/ifcfg-eth0
1.2 配置主机名:
vi /etc/sysconfig/network
1.3 配置hosts:
vi /etc/hosts
1.4 关闭防火墙&Selinux:
(1)service iptables stop
(2) chkconfig iptables off
(3) vi /etc/selinux/config
SELINUX=disabled
这样设置更安全,如时间错了就把相应文件变成只读文件
1.5 建立需要的文件夹存放安装文档
(1)存放安装软件 mkdir software
(2)在opt目录中建立gy 文件夹cd /opt
mkdir gy
2、jdk安装
2.1用xshell传文件
- 安装好xshell之后需要下载Xftp4(用于传文件,链接中有下载文件xshell、Xftp4哦)
- 如何传文件?
2.2. 用rpm装jdk,首先在node01上安装
- 在根目录下,输入安装命令
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
红色框内为打错的,大家可不要出现输入错误哦
输入jps,结果出现 xxxx jps,说明安装成功
注意:出现 command not find<1>、查看是否输入正确,source必须执行,否则修改无效
<2>、更改绝对路径export JAVA_HOME=/usr/bin/java
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin
2.3 将jdk 分发到node02、node03、node04,并安装(方法同node01安装相同)
(1)传文件(在node01上):
注意pwd左右两边的符号,是tab键上面那个
scp jdk-7u67-linux-x64.rpm node02:`pwd`
scp jdk-7u67-linux-x64.rpm node03:`pwd`
scp jdk-7u67-linux-x64.rpm node04:`pwd`
(2)安装文件
-
在node03、node04、node05上执行rpm安装命令:
-rpm -i jdk-7u67-linux-x64.rpm
-
分发文件node01中的profile文件分发node02、node03、node04
scp profile node02:`pwd` scp profile node03:`pwd` scp profile node04:`pwd`
注意pwd左右两边的符号,是tab键上面那个
(3) 检查是否安装完成
利用Xshell全部会话栏,source /etc/profile
利用Xshell全部会话栏,jps,看02、03、04这三台机子的jdk是否装好。
输入jps,结果出现 xxxx jps,说明安装成功
3、同步所有服务器时间
3.1为什么要同步时间
时间相差太大,集群启动后某些进程跑不起来,所以要同步时间
3.2如何同步时间
- yum进行时间同步器的安装
yum -yinstall nt
- 执行同步命令
ntpdate time1.aliyun.com 和阿里云服务器时间同步
4、检查配置文件
- 查看HOSTNAME是否正确(四台机子都要看)
cat /etc/sysconfig/network
- 查看IP映射是否正确(四台机子都要查看)
cat /etc/hosts
- 查看SELINUX是否disabled(四个都要看)
cat /etc/sysconfig/selinux
SELINUX=disabled
- 查看防火墙(四个都要看,全部会话即可)
service iptables status
5、免秘钥设置
5.1如何给每台虚拟机免秘钥
-
在家目录下
ll -a
:查看有无.ssh文件,如果没有就ssh localhost
ssh localhost 之后一定要exit退出,不然出大问题哦 -
cd .ssh
,并ll
查看当前文件 -
免秘钥操作:
-ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
-cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_key
验证:
ssh localhost 看看需不需要输入密码一定要exit哦
补充说明:(借用老师上课时用的图片说明一下)
5.2 如何让node01与其他三台机子免密
-
在node01上给其他三个发送公钥( 路径为:
cd .ssh
)scp id_dsa.pub node02:`pwd`/node01.pub scp id_dsa.pub node03:`pwd`/node01.pub scp id_dsa.pub node04:`pwd`/node01.pub
-
查看一下发送成功没有(到node02、node03、node04的.ssh文件下去看)
首先到目录:cd .ssh
接下来去查看一下 node02:
node03:
node04: -
在另外三台机子上追加(node02、node03、node04都要哦)
cat node01.pub >> authorized_keys
验证:
在node01上分别ssh node02
,ssh node03
,ssh node04
,看看能否免秘钥登录
记得ssh 登录以后以后一定要exit
5.3 让两个Namenode之间免秘钥
首先做5、1 使每台机子自己可以免秘钥登录
现在实现让node02也可以直接登录node01
- 在 node02上:
scp id_dsa.pub node01:'pwd'/node02.pub
在node01的.ssh目录下:cat node02.pub >> authorized_keys
- 在node02上
ssh node01
验证可否免秘钥登录
6、namenode信息的配置信息修改
6.1 vi hdfs-site.xml修改
到Hadoop目录下更改:cd /opt/gy/hadoop-2.6.5/etc/hadoop/
(1)去掉snn的配置
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node03:50090</value>
</property>
(2)增加以下property
<!-- 为namenode集群定义一个services name -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--指定HDFS副本的数量,不能超过机器节点数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- nameservice 包含哪些namenode,为各个namenode起名 -->
<property>
<name>dfs.ha.namenodes. mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 名为nn1的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
<property>
<name>dfs.namenode.rpc-address. mycluster.nn1</name>
<value>node01:9000</value>
</property>
<!--名为nn1的namenode的http地址和端口号,用来和web客户端通讯 -->
<property>
<name>dfs.namenode.http-address. mycluster.nn1</name>
<value>node01:50070</value>
</property>
<!-- 名为nn2的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:9000</value>
</property>
<!--名为nn2的namenode的http地址和端口号,用来和web客户端通讯 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
<!-- namenode间用于共享编辑日志的journal节点列表 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node02:8485;node03:8485;node04:8485/mycluster</value>
</property>
<!-- journalnode 上用于存放edits日志的目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/gy/hadoop/ha/jn</value> //这里的gy改成你建立的名字
</property>
<!-- 指定该集群出现故障时,是否自动切换到另一台namenode -->
<property>
<name>dfs.ha.automatic-failover.enabled.cluster</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 一旦需要NameNode切换,使用ssh方式进行操作 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
改动处写有文字注释、注意修改哦
6.2 vi core-site.xml 配置
<!– 集群名称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>
vi slaves
删除node01 添加如下
node02
node03
node04
这段文字改动很小,创建文件名改一下,主机名改一下,但是,一定要注意检查多遍,以防错误,后面查日志文件多半是这里出错
7、安装hadoop2.6.5
7.1如何安装Hadoop
先在node01中安装,后面传输一下即可,传文件方法前面已介绍
-
利用tar 命令直接解压安装包(此处的gy是自己创建的,具体在文章开头已介绍)
-tar xf hadoop-2.6.5.tar.gz -C /opt/gy (注:-C的C 是大写)
到/opt/gy目录下看是否解压好
cd /opt/gy/hadoop-2.6.5
-
想要实现任意目录下均可启动hadoop
在目录:cd /opt/gy/hadoop-2.6.5/etc/hadoop/vi + /etc/profile
export JAVA_HOME=/usr/bin/java export HADOOP_HOME=/opt/ldy/hadoop-2.6.5 export PATH=$PATH:/usr/java/jdk1.7.0_67/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
在hadoop路径下(前面完整路径,黄色加粗字体),修改profile文件
进入文件内修改(修改完 !wq 保存退出)
修改完成一定要source
验证:输入hd按Tab键可以联想出hdfs
输入start-d按Tab键可以联想出start-dfs.
就表示配置成功了
不要忘记source,更改会不生效哦
7.2修改Hadoop配置文件
-
在etc目录中修改:
cd /opt/ldy/hadoop-2.6.5/etc/hadoop
以上路径的etc不是根目录的etcvi hadoop-env.sh vi mapred-env.sh vi yarn-env.sh
给这三个文件夹的JAVA_HOME改成绝对路径:/usr/java/jdk1.7.0_67
如下图所示修改
修改的那句如果有#须要去除
PS:详细的过程可以参考目录下二、伪分布式安装,进行对比学习
7.2.3如何实现四台机子方便的配置
-
到opt目录下,将其下的目录分发到node02、node03、node04
在目录:cd /opt
scp –r gy/ node02:`pwd` scp –r gy/ node03:`pwd` scp –r gy/ node04:`pwd`
pwd左右的符号是tab键上方的键
-
将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`
pwd上的符号注意注意
8、安装zookeeper
8.1解压安装配置文件
zookeeper是在node02、node03、node04上安装的
-
解压安装zookeeper
(1)在目录:cd /sotfware
(四台都在sotfware里安装,如果无根目录下mkdir softer
)tar xf zookeeper-3.4.6.tar.gz -C /opt/gy
(2)下载传输完成后可以看到在software里看到文件
(3)在sotfware目录下解压安装tar xf zookeeper-3.4.6.tar.gz -C /opt/gy
(gy是你新建的文件夹,在前期准备中有 介绍)
(4)安装完成在gy文件夹下查看 -
修改zookeeper的配置文件
(1)cd /opt/gy/zookeeper-3.4.6/conf
(2) 给zoo_sample.cfg改名(以防改错,我们这里用复制命令)cp zoo_sample.cfg zoo.cfg
-
vi zoo.cfg
修改信息
dataDir=/var/gy/zk
(1)查看是否有zoo.cfg文件
(2)进行修改(数据路径)(3)并在末尾追加
server.1=node04:2888:3888 server.2=node05:2888:3888 server.3=node06:2888:3888
其中2888主从通信端口,3888是当主挂断后进行选举机制的端口
8.2如何方便的实现其他几台zookeeper搭建
-
把zookeeper分发到其他节点
当gy目录下:cd /opt/gy
scp -r zookeeper-3.4.6/ node03:`pwd` scp -r zookeeper-3.4.6/ node04:`pwd`
并用ll /opt/gy检查下看分发成功没
修改pwd上方符号 -
给每台机子创建刚配置文件里的路径
(1)绝对路径,任意目录下均可:mkdir -p /var/gy/zk
cd /var/gy/zk/
对node02来说: echo 1 > /var/gy/zk/myid cat /var/gy/zk/myid 对node03来说: echo 2 > /var/gy/zk/myid cat /var/gy/zk/myid 对node04来说: echo 3 > /var/gy/zk/myid cat /var/gy/zk/myid
(2)图片示意(node04):
编号必须是数字 -
分发profile文件
(1)先确定zookeeper-3.4.6的路径(按照下载的一般是/opt/gy/zookeeper-3.4.6其中gy是自己建立的文件名)
(2)在node02中的 /etc/profile里面配置vi + /etc/profile
export ZOOKEEPER_HOME=/opt/gy/zookeeper-3.4.6 export PATH=$PATH:/usr/java/jdk1.7.0_67/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
第一行是添加、第二行是修改
(2)在node02中,然后在把/etc/profile分发到其他node03、node04(绝对路径,所以在哪个路径下皆可以)scp /etc/profile node05:/etc scp /etc/profile node06:/etc
(3)在node02、03、04里
source /etc/profie
输入zkCli.s,按Tab可以把名字补全zkCli.sh
8.3启动zookeeper
-
全部会话:
zkServer.sh start
-
接着用
zkServer.sh status
查看每个zookeeper节点的状态注意:如果启动不起来,请把/etc/profile里的 JAVA_HOME改
成绝对路径。然后记得source刷新一下export JAVA_HOME=/usr/bin/java
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin
source /etc/profie
如下图所示:就是启动失败
修改绝对路径(四台都要改)
由于我们是在node02、node03、node04上装的,所以全部会话,在node01上找不到命令,是正常的
9、启动journalnode
-
启动namenode的原因:为了使两台namenode间完成数据同步
-
在01、02、03三台机子上分别把journalnode启动起来
hadoop-daemon.sh start journalnode
用jps检查下进程启起来了没node01:
node02:
node03:
没启动起来
检查日志:cd /opt/gy/hadoop-2.6.5/logs/
tail -100 hadoop-root-journalnode-node01.log
(相应的日志里去找一下)
常见问题:配置文件括号对应、出现空格等
10、格式化任一namenode
-
随意挑一台namenode上执行
hdfs namenode –format
另一台namenode不用执行,否则clusterID变了,找不到集群了。 -
然后,启动刚刚格式化的那台namenode
hadoop-daemon.sh start namenode
jps命令出现namenode,没有的话查日志(hdfs配置)
下面这个错误就是括号不对应,参考一下 -
我们要给另一台namenode同步一下数据,用以下命令
(1)hdfs namenode -bootstrapStandby
(2)格式化zkfc-
在node01上执行
hdfs zkfc -formatZK
-
在node02上双击开启另一个,执行zkCli.sh打开zookeeper客户端看hadoop-ha是否打开,
ls /
看是否成功打开Hadoop-ha双击node02:
在双击后形成的3 node02上执行zkCli.sh、ls查看
PS:因为执行完zkcli.sh命令以后会导致无法返回,所以先多开一个,方便操作
-
11、启动集群
-
在node01上启动hdfs集群:
start-dfs.sh
-
全部会话jps查看都有些什么进程,如果和下图一样,恭喜小可爱成功一半啦
node01:
node02:
node03:
node04: -
如果那个节点没起来到hadoop目录下去看那个node的日志文件log
静下心来慢慢找错,日志会提示错误哦hadoop-daemon.sh start journalnode cd /opt/ldy/hadoop-2.6.5/logs/ tail -100 hadoop-root-journalnode-node03.log
-
接下来去浏览器访问node01:50070和node02:50070
-
关闭集群:
stop-dfs.sh
-
关闭zookeeper命令:
zkServer.sh stop
注意:你下一次启动hdfs集群的时候不需要用hadoop-daemon.sh start journalnode
命令启动journalnode
只要start-dfs.sh就可以了。我们之前启动journalnode是为了同步两个namenode之间的信息。
12、为MapReduce做准备
- 把mapred-site.xml.template留个备份,并且改下名字 node01里先改,发送到node02、node03、node04
cp mapred-site.xml.template mapred-site.xml
在mapred-site.xml里添加如下property
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- 在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 分发到node04、05、06
scp mapred-site.xml yarn-site.xml node02:`pwd`
scp mapred-site.xml yarn-site.xml node03:`pwd`
scp mapred-site.xml yarn-site.xml node04:`pwd`
-
node03和node04之间相互免秘钥(参考5)
用localhost以后一定要exit
PS:node 03与node04都是resourcemanager,所以他们相互免秘钥 -
完整的启动步骤
启动zookeeper,全部会话zkServer.sh start
在node01上启动hdfs,start-dfs.sh
在node01上启动yarn,start-yarn.sh
在node02、03上分别启动resourcemanager,yarn-daemon.sh start resourcemanager
全部会话jps,看进程全不全node01:
node02:
node03:
node04: -
在浏览器访问node03:8088,查看resourcemanager
-
完整的退出步骤
关闭集群:
node01:stop-dfs.sh
node01:stop-yarn.sh
(停止nodemanager)
node03,node04:yarn-daemon.sh stop resourcemanager
Node02、03、04:zkServer.sh stop
如何看是否完全退出
jps之后只有jps xxx
13、完成一个wordcount
-
到如下目录
cd /opt/ldy/hadoop-2.6.5/share/hadoop/mapreduce
-
在hdfs里建立输入目录和输出目录
hdfs dfs -mkdir -p /data/in hdfs dfs -mkdir -p /data/out
-
将要统计数据的文件上传到输入目录并查看
hdfs dfs -put ~/500miles.txt /data/input hdfs dfs -ls /data/input
-
运行wordcount(注意:此时的/data/out必须是空目录)
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/in /data/out/result
-
你成功了吗?
首先观察一下,是否出现如下进程map变化
其次去网页观察一下,有sucess嘛
最后我们再去看一下运行完的程序结果
记住此时的/data/out必须是空目录
补充:1、运行失败查看日志文件,多半是配置错误,回到6检查一遍哦
2、运行较慢可能出现map百分之75,最后100%,这样问题不大, 可以成功等等就好
3、data/out 运行第二次不为空了,创建另一个文件hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/in /data/out/result_1
或者删除
在dfs中删除目录:hadoop fs -rm -r /data/out/result
14、错误小结
问题小结–个人比较粗心遇到的问题比较多,不过解决后收获较多
-
jps后namenode总不出来
1、根据日志报错(前面有如何看日志介绍见12、3)
2、日志居然找不到错误,检查一下配置(见6 namenode配置,没有空格的地方不要多空格)
3、修改了node01的配置文件,一定记得传输给其他之前同样配置机子。 -
node01与node02同步了
1、localhost忘记退出了导致混乱,千万不要犯这种低级错误 -
实现wordout总出现错误
1、根据mycluster,找到有关他的配置文件,如果无误2、etc/hosts 文件是否配对
-
出现命令找不到
1、查找自己是否打错,要细心哦
2、查看目录,看一下是否存在 -
输入易错点
1、免秘钥处 -f前面有空格-ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
2、pwd上面的符号,在tab上方,不要打成分号
3、输入目录名可以利用tab键自动生成剩余完整的目录名 -
浏览器打不开
1、hosts里面配置检查一遍cat /etc/sysconfig/network
- 查看IP映射是否正确
cat /etc/hosts
3、浏览器不要用360、QQ浏览器,最好用火狐
- 物理内存不足(实际内存够的)
找到编辑->首选项
选择允许交换大部分虚拟机内存 - 打不开也关不掉虚拟机显示繁忙(特别常见)
这个问题很容易解决,可以关机重启,删除对应虚拟机存储文件多出的前四个文件
(这个方法最有效,虚拟机多次出现这个问题已解决)
删除的文件可以参考这个链接: https://blog.csdn.net/s546889/article/details/105045714.
以上就是整个过程,如果还有什么问题欢迎评论
来源:oschina
链接:https://my.oschina.net/u/4285472/blog/4316658