Hadoop高可用安装教程
- 本教程为Hadoop高可用安装过程及部分错误的解决方案。(主要错误在于zookeeper的启动并罗列了几种解决方案)
- 安装方案:
- 1、分发jdk到node02、03、04
- 2、给node02、03、04分别安装jdk
- 3、同步所有服务器的时间
- 4、装机之前的配置文件检查
- 5、NN与其他三台机子的免秘钥设置
- 6、两个NN间互相免**
- 7、修改namenode的一些配置信息
- 8、安装zookeeper
- 9、启动journalnode(使两台namenode间完成数据同步)
- 10、随意挑一台namenode上执行hdfs namenode –format
- 11、给另一namenode同步数据
- 12、格式化zkfc
- 13、在node01上启动hdfs集群
- 14、用浏览器访问node01:50070和node02:50070
- 15、关闭
- 16、为MapReduce做准备
- 17、测试wordcount
- 18、关闭集群
- 19、在Windows下配置hadoop的环境
本教程为Hadoop高可用安装过程及部分错误的解决方案。(主要错误在于zookeeper的启动并罗列了几种解决方案)
安装方案:
1、分发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
并在Xshell的全部会话栏里一起ll,看jdk是否发送成功。
2、给node02、03、04分别安装jdk
分别在node02、03、04上执行rpm安装命令
-rpm -i jdk-7u67-linux-x64.rpm
在node03上cd /etc,在此目录下把profile文件分发到node02、03、04上。
scp profile node02:pwd
利用Xshell全部会话栏,source /etc/profile
利用Xshell全部会话栏,jps,看02、03、04这三台机子的jdk是否装好
3、同步所有服务器的时间
-date 查看机子当前的时间。
时间不能差太大,否则集群启动后某些进程跑不起来。
(1)yum进行时间同步器的安装
-yum -y install ntp
(2)执行同步命令
-ntpdate time1.aliyun.com 和阿里云服务器时间同步
4、装机之前的配置文件检查
(1)-cat /etc/sysconfig/network,查看HOSTNAME是否正确
此时出错:
修改一个机子的hostname另外三台就一起变化
解决方案:
(2)-cat /etc/hosts
查看IP映射是否正确
若不正确,可以改文件,也可以把node01上的用scp分发过去。
(3)-cat /etc/sysconfig/selinux里是否
SELINUX=disabled
(4)service iptables status查看防火墙是否关闭
5、NN与其他三台机子的免秘钥设置
(1) 在家目录下 ll –a看下有无.ssh文件,如果没有就ssh loalhost
一下(铁憨憨才会ssh localhost后忘记exit)。
(2)cd .ssh ,并ll查看一下
(3)把node01的公钥发给其他三台机子
(4)同理给其他节点发送公钥并在各个节点上把node01的公钥追加上
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
node01上免**登录其他三台机器:
(5)在node02的.ssh目录下看是否有node01.pub
如果有,那就追加到authorized_keys:cat node01.pub >> authorized_keys
并且在node01上ssh node02看是否免**了,别忘了exit,给node03、04都追加一下node01.pub,也就是在node03、04的.ssh目录下执行cat node01.pub >> authorized_keys
6、两个NN间互相免**
node01与node02间互相免**: node01可免**登录node02,那现
需node02上能免**登node01,所以
在node02上:
ssh-****** -t dsa -P ‘’ -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ssh localhost验证一下
分发到node03上:scp id_dsa.pub node03:pwd/node04.pub
在node03的.ssh目录下,cat node04.pub >> authorized_keys,
在node04上ssh node03验证一下可否免**登录
7、修改namenode的一些配置信息
(1)vi hdfs-site.xml
(a)去掉snn的配置
dfs.namenode.secondary.http-address
node03:50090
(b)增加以下property
dfs.replication
3
(3)vi slaves
node02
node03
node04
(4)安装hadoop
cd /opt ,将其下的ldy目录分发到node02、03、04
scp –r mxy/ node02:pwd
scp –r mxy/ node03:pwd
scp –r mxy/ node04:pwd
(5)将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
分发以名字缩写命名的文件夹成功:
检查是否成功:
8、安装zookeeper
有无software,没有便创建
(1)解压安装zookeeper
tar xf zookeeper-3.4.6.tar.gz -C /opt/mxy
(2)修改zookeeper的配置文件:cd /opt/mxy/zookeeper-3.4.6/conf
给zoo_sample.cfg改名:cp zoo_sample.cfg zoo.cfg
(3)vi zoo.cfg
改dataDir=/var/ldy/zk
并在末尾追加
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
其中2888主从通信端口,3888是当主挂断后进行选举机制的端口
(4)把zookeeper分发到其他节点,此时需要密码是正常的,未做免**操作
scp -r zookeeper-3.4.6/ node03:pwd
scp -r zookeeper-3.4.6/ node04:pwd
并用ll /opt/mxy检查下看分发成功没
(5)给每台机子创建刚配置文件里的路径
mkdir -p /var/mxy/zk
对node02来说:echo 1 > /var/ldy/zk/myid
cat /var/mxy/zk/myid
对node03来说:echo 2 > /var/mxy/zk/myid
cat /var/mxy/zk/myid
对node04来说:echo 3 > /var/mxy/zk/myid
cat /var/ldy/zk/myid
(6)在/etc/profile里面配置
export ZOOKEEPER_HOME=/opt/mxy/zookeeper-3.4.6
export PATH=HADOOP_HOME/bin:ZOOKEEPER_HOME/bin
(7)然后在把/etc/profile分发到其他node03、node04
scp /etc/profile node03:/etc
scp /etc/profile node04:/etc
此时出错:node0304输入zkCli.s,按Tab不可以把名字补全zkCli.sh
解决方案:在node02、03、04里source /etc/profie
(8)启动zookeeper
全部会话:zkServer.sh start
接着用zkServer.sh status查看每个zookeeper节点的状态
注意:如果启动不起来,请把/etc/profile里的JAVA_HOME改
成绝对路径。
此时出错:
分析原因及解决方法:
(1)端口被占用。在前台显示问题zkServer.sh start-foreground
若显示如下图片:
则执行netstat -alnp | grep 2181 查看被占用端口,执行kill -9 4840 杀死占用端口的进程,重启zookeeper
(2)打开zkServer.sh 找到status
STAT=echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode
在nc与localhost之间加上 -q 1 (是数字1而不是字母l)
如果已存在则去掉
注:zookeeper3.4.5以后的版本的zkServer.sh脚本文件里根本没有这一行
(3)创建数据目录,也就是在你zoo.cfg配置文件里dataDir指定的那个目录下创建myid文件,并且指定id,改id为你zoo.cfg文件中server.1=localhost:2888:3888中的 1.只要在myid头部写入1即可.
(4)防火墙未关闭。
查看防火墙状态:service iptables status
关闭防火墙:service iptables stop
查看防火墙开机启动状态:chkconfig iptables --list
关闭防火墙开机启动:chkconfig iptables off
注:防火墙已经确认关闭,所以也不是这步出了问题。
(5)没有建立主机和ip之间的映射关系。命令为 vi /etc/hosts 在文件的末端加入各个主机和ip地址之间的映射关系就可以了。
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
server要从1开始
注:这一步已经反复检查未曾出错
(6)单个机子逐步查看启动,此集群务必保证有3台机子同时正常启动,
(7)删除zookeeper 本地log的Version-2文件夹:rm -rf version-2,重启zookeeper 状态就正常了
(8)将data目录下的.pid文件删除后重新启动。
解决方案:
最后询问同学,发现配置hdfs-site.xml的时候,复制老师的代码未将添加上
9、启动journalnode(使两台namenode间完成数据同步)
在03、04、05三台机子上分别把journalnode启动起来
hadoop-daemon.sh start journalnode
用jps检查下进程启起来了没
10、随意挑一台namenode上执行hdfs namenode –format
另一台namenode不用执行,否则clusterID变了,找不到
集群了。
然后,启动刚刚格式化的那太namenode
hadoop-daemon.sh start namenode
11、给另一namenode同步数据
hdfs namenode -bootstrapStandby
此时错误:
第二台namenode无法同步
解决方案:
hdfs namenode –bootstrapStandby
↑把NameNode的数据同步到node02上↑
hadoop-daemon.sh start namenode
↑启动node02上的namenode作为standby
12、格式化zkfc
hdfs zkfc -formatZK
在node02上执行zkCli.sh打开zookeeper客户端看hadoop-ha是否打开
13、在node01上启动hdfs集群
start-dfs.sh
注意:如果那个节点没起来到hadoop目录下去看那个
node的日志文件log
然后全部会话jps看一下都起来些什么进程
14、用浏览器访问node01:50070和node02:50070
`
15、关闭
关闭集群命令:stop-dfs.sh
关闭zookeeper命令:zkServer.sh stop
16、为MapReduce做准备
把mapred-site.xml.template留个备份,并且改下名字
cp mapred-site.xml.template mapred-site.xml
(1)在mapred-site.xml里添加如下property
mapreduce.framework.name
yarn
(2)在yarn-site.xml里添加如下property
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
cluster1
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
node03
yarn.resourcemanager.hostname.rm2
node04
yarn.resourcemanager.zk-address
node02:2181,node03:2181,node04:2181
(3)把mapred-site.xml和yarn-site.xml 分发到node02、03、04
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
(4)由于node03和node04都是resourcemanager,所以它俩应该相互免**
a)node03上免**登录node04:
在node03的.ssh目录下生成**:ssh-****** -t dsa -P ‘’ -f ./id_dsa
并追加到自己authorized_keys:cat id_dsa.pub >> authorized_keys
用ssh localhost验证看是否需要密码,别忘了exit
将node03 的公钥分发到node04:scp id_dsa.pub node06:pwd/node05.pub
在node04的.ssh目录下,追加node03.pub:cat node05.pub >> authorized_keys
在node03上ssh node04,看是否免**
b)node04上免**登录node03:
在node04的.ssh目录下生成**:ssh-****** -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,看是否免**
(5)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,看进程全不全
(6)在浏览器访问node03:8088,查看resourcemanager管理的内容
17、测试wordcount
(1)cd /opt/mxy/hadoop-2.6.5/share/hadoop/mapreduce
(2)在hdfs里建立输入目录和输出目录
hdfs dfs -mkdir -p /data/in
hdfs dfs -mkdir -p /data/out
(3)将要统计数据的文件上传到输入目录并查看
hdfs dfs -put ~/500miles.txt /data/input
hdfs dfs -ls /data/input
(4)运行wordcount(注意:此时的/data/out必须是空目录
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/in /data/out/result
(5)查看运行结果
hdfs dfs -ls /data/out/result
hdfs dfs -cat /data/out/result/part-r-00000
18、关闭集群
node01: stop-dfs.sh
node01: stop-yarn.sh (停止nodemanager)
node03,node04: yarn-daemon.sh stop resourcemanager
node02、03、04:zkServer.sh stop
19、在Windows下配置hadoop的环境
(1)把压缩包解压后的这三个文件夹放到一个usr文件夹里,把usr放到一个你知道的地方。
(2)“此电脑”右键-属性-高级系统设置
(3)更改环境变量,增加HADOOP_HOME
(4)并且给path后追加HADOOP_HOME的bin目录。
注意:Windows里path的路径分隔符是分号,而不是冒号。
(5)然后再新建一个变量HADOOP_USER_NAME
(6)安装ecipse-mars,此版本的eclipse带插件,可以可视化
的看到hadoop的一些东西,比较方便
(7)如果eclipse界面下方没有小象图标,则做后续三步调出
(8)这样在eclipse左侧列表的DFS location里新建一个目录,对应hdfs里也就建好了,可以用浏览器查看一下。
(9)在eclipse里导入自己建一个包库
(10)把jar包导入刚建的包库
(11)把刚建的包库引入到project里
(12)把JUnit包库引入到project里
(13)利用xftp把hdfs-site.xml,core-site.xml等几个xml放到
project的src目录。