Hadoop高可用安装
在安装了伪分布式hadoop前提下,实现高可用安装,这里我的集群分别是node02、node03、node04、node05。
以下是四台虚拟机上的Hadoop安装方案:
NN-1 | NN-2 | DN | ZK | ZKFC | JN | RS | NM | |
---|---|---|---|---|---|---|---|---|
node02 | * | * | * | |||||
node03 | * | * | * | * | * | * | ||
node04 | * | * | * | * | * | |||
node05 | * | * | * | * |
由于已经实现了伪分布式安装,node02上已经完成了hadoop的安装和jdk的配置。
1. 首先完成其他三台的jdk配置。
将node02上的位于/root 下的jdk分发到另外三台机子
scp jdk-7u67-linux-x64.rpm node03:pwd
scp jdk-7u67-linux-x64.rpm node04:pwd
scp jdk-7u67-linux-x64.rpm node05:pwd
检查是否发送成功,在xshell的全部会话下进入root 输入ll查看
分别在node03、node04、node05上执行rpm安装命令
rpm -i jdk-7u67-linux-x64.rpm
在node02上,进入/etc目录
cd /etc
把在此目录下把profile文件分发到node03、node04、node05上。
scp profile node03:`pwd`
scp profile node04:`pwd`
scp profile node06:`pwd`
发好后再去这三台机子改目录文件下检查一下是否存在
在全部会话栏
source /etc/profile
完成后再全部会话栏
jps
看node03、node04、node05这三台机子的jdk是否装好
2. 检查虚拟机时间同步
查看机子当前的时间,可以输入date
查看
为了保证时间准确同步,利用yum进行时间同步器的安装
yum -y install ntp
执行同步命令,和阿里云服务器时间同步
ntpdate time1.aliyun.com
这时候再输入date确认一下
3. 检查网络配置
查看HOSTNAME是否正确
cat /etc/sysconfig/network
查看IP映射是否正确
cat /etc/hosts
cat /etc/sysconfig/selinux
确认SELINUX为disabled
service iptables status
查看防火墙是否关闭
4. 为虚拟机设置免密钥
在伪分布式安装中已经为node02生成了密钥文件
在node02在家目录下
ll –a
查看有无.ssh文件,如果没有就
ssh loalhost
!!这步命令后一定要记得输入
exit
进入.ssh文件
cd .ssh
保险起见,输入ll
查看
把node02的公钥发给其他三台机子,使得node02能免密钥登录其他三台
scp id_dsa.pub node03:`pwd`/node02.pub
scp id_dsa.pub node03:`pwd`/node02.pub
scp id_dsa.pub node03:`pwd`/node02.pub
分别到03、04、05上将node02的密钥追加到authorized_keys
cat node02.pub >> authorized_keys
之后在node02上分别ssh node03
、ssh node04
、ssh node05
,检查免密钥是否成功,每次不要忘记exit
由于node03也是namenode,所以node03也需要免密钥登录node02
在node03上生成自己的密钥
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
将自己的密钥追加到authorized_keys
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ssh localhost
验证一下
把自己的密钥分发到node02上:
scp id_dsa.pub node02:`pwd`/node03.pub
来到node02,将收到的node03密钥追加到authorized_keys
cat node03.pub >> authorized_keys
回到node03 输入ssh node02是否能免密钥登录node02
5. 修改namenode配置信息
进入/opt/yzs/hadoop-2.6.5/etc/hadoop的hdfs-sitex.xml文件中,将中的代码修改为如下内容
<configuration>
<property>
<name>dfs.replication</name>
<value>3</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>node02:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node03:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node02:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node03:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node02:8485;node03:8485;node04:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/yzs/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>
</configuration>
同样 将core-site.xml修改为如下内容
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node03:2181,node04:2181,node05:2181</value>
</property>
</configuration>
这里由于xshell并不是专门用来编辑代码的,很容易出错而发现不了,所以我推荐用xftp将两个文件拖到window桌面上,利用sublime等编辑器修改后再放回虚拟机中。
还是在这个目录下,修改slaves文件
删去原有内容,加入当前datenode节点虚拟机名称
6. 安装hadoop
vi zoo.cfg
将dataDir后面的改为/var/yzs/zk
在文件最后加上
server.1=node03:2888:3888
server.2=node04:2888:3888
server.3=node05:2888:3888
完成后esc :wq
退出
7. 安装zookeeper
目录转到/opt/yzs ll可以看到文件下的zookeeper-3.4.6
把zookeeper分发到其他节点
scp -r zookeeper-3.4.6/ node04:`pwd`
scp -r zookeeper-3.4.6/ node05:`pwd`
这时候是需要密钥的 输入密码hadoop
到node04 node05检查一下
在全部会话里,给node03 node04 node05创建刚配置文件里的路径
mkdir -p /var/ldy/zk
给每台机子配置其编号(必须是阿拉伯数字)
对node03来说:
echo 1 > /var/ldy/zk/myid
对node04来说:
echo 2 > /var/ldy/zk/myid
对node05来说:
echo 3 > /var/ldy/zk/myid
在创建echo后再全部会话查看检查每个机子的编号
在node03 里输入
vi /etc/profile
添加
export ZOOKEEPER_HOME=/opt/yzs/zookeeper-3.4.6
修改
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
再三检查是否正确!!!
退出esc保存:wq
然后在把/etc/profile分发到其他node04、node05
scp /etc/profile node04:/etc
scp /etc/profile node05:/etc
这里也要输入密钥
再到node04 node05检查一下有没有这个文件
在全部会话里
source /etc/profile
验证source这句是否完成
输入zkCli.s
,按Tab可以把名字补全zkCli.sh
启动zookeeper
全部会话:zkServer.sh start
接着用zkServer.sh status
查看每个zookeeper节点的状态
但发现没有启动
可能是profile路径写错了
尝试把路径写成绝对路径,也错了
中途去吃了个饭,不小心有又强制关了VMware,结果node03不能启动。
https://www.cnblogs.com/shenzhenhuaya/p/sfaegtrg.html
通过这篇文章解决了
上网搜了一下,最终以通过禁用启动项的方式结束了旧的进程占用,但是当我再次打开时
😦
通过这篇文章解决了以上问题
https://blog.csdn.net/baigoocn/article/details/42267261
解决后,虚拟机能正常运行,但是由于重新启动,之前配置的ip不能用了,xshell不能连上虚拟机。
于是我尝试了还原了VMware的虚拟网络编辑器
重新给四台机子设置ip
最后的最后,终于发现是JAVA_HOME在之前就写错了!
马上修改 运行成功
8. 启动journalnode
在02、03、04三台机子上分别把journalnode启动起来
hadoop-daemon.sh start journalnode
用jps检查下进程启起来了没
发现都没启动
进到
cd /opt/yzs/hadoop-2.6.5/logs
查看log文件
tail -100 hadoop-root-journalnode-node02.log
原来是hdfs-site.xml 里configuration打错了
每天提醒自己不要打错字!!!
修改四台机子的hdfs-site.xml
重新启动前三台
hadoop-daemon.sh start journalnode
jps
一下看看进程
成功!!
9. 格式化namenode
选择编号最小的node格式化
hdfs namenode –format
然后,启动刚刚格式化的那太namenode
hadoop-daemon.sh start namenode
Namenode没有起来
查看log文件 发现是ip没对上 因为之前ip修改过
hadoop namenode -format
重新启动
hdfs namenode –format
成功
要给另一台namenode,也就是node03同步一下数据
hdfs zkfc -formatZK
这时候双击node03 再打开一个窗口
zkCli.sh
查看hadoop-ha是否打开
ls /
在node02启动hdfs集群
start-dfs.sh
然后全部会话jps看一下都起来些什么进程
Node03的Namenode没有启动
去log里看看
cd /opt/yzs/hadoop-2.6.5/logs
打开log
tail -100 hadoop-root-namenode-node03.log
但是查了半天没发现什么错误
重新打开集群和zookeeper
发现可以了!
hadoop-daemon.shstart journalnode
在网页上输入node02:50070
node03:50070
成功!
之后发现,上面出现第二台机子没有namenode的问题因为在运行第一台namenode后, 没有运行同步数据
hdfs namenode –bootstrapStandby
至此集群启动问题全部解决
10. 为MapReduce做准备
进入如下地址
cd /opt/yzs/hadoop-2.6.5/etc/hadoop/
把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>
在yarn-site.xml里添加如下property
```html
<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>node04</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node05</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node03:2181,node04:2181,node05:2181</value>
</property>
把mapred-site.xml和yarn-site.xml 分发到node03、04、05
scp mapred-site.xml yarn-site.xml node03:`pwd`
scp mapred-site.xml yarn-site.xml node04:`pwd`
scp mapred-site.xml yarn-site.xml node05:`pwd`
之前设置了免密钥 所以不用输入密码
由于node05和node06都是resourcemanager,所以为它两设置免密钥
在家目录下
cd .ssh
首先是node04上免密钥登录node05:
在node04的.ssh目录下生成密钥
ssh-keygen -t dsa -P '' -f ./id_dsa
并追加到自己authorized_keys
cat id_dsa.pub >> authorized_keys
用ssh localhost
验证看是否需要密码,别忘了exit
将node04 的公钥分发到node05
scp id_dsa.pub node05:pwd/node04.pub
在node05的.ssh目录下,追加node04.pub
cat node04.pub >> authorized_keys
在node04上ssh node05,看是否免密钥,别忘了exit
node05上免密钥登录node04:
在node05的.ssh目录下生成密钥
ssh-keygen -t dsa -P '' -f ./id_dsa
并追加到自己authorized_keys
cat id_dsa.pub >> authorized_keys
用ssh localhost
验证看是否需要密码,别忘了exit
将node05的公钥分发到node04
scp id_dsa.pub node04:pwd/node05.pub
在node04的.ssh目录下,追加node05.pub
cat node05.pub >> authorized_keys
在node05上ssh node04,看是否免密钥,别忘了exit
到现在就可以启动集群了
1.启动zookeeper,全部会话zkServer.sh start
2.在node02上启动hdfs,start-dfs.sh
3.在node02上启动yarn,start-yarn.sh
4.在node04、05上分别启动resourcemanager,
yarn-daemon.sh start resourcemanager
5.全部会话jps,看进程全不全
发现第一台namenode没有启动
尝试重新启动
成功
在浏览器访问node04:8088,查看resourcemanager管理的内容
11. 跑一个wordcount试试
1.cd /opt/yzs/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/in
hdfs dfs -ls /data/in
4.运行wordcount(注意:此时的/data/out必须是空目录
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/in /data/out/result
发现上传文件时失败,参考了如下方法
https://blog.csdn.net/IT_NEU_Lee/article/details/82717517
这里如果因为格式化多次而了出问题
可以分别去node02,node03,node04
cd /tmp/hadoop-root/dfs/data/current/
vi VERSION
要保证node02,node03,node04的VERSION文件中的clusterID一样
我采用了简答粗暴的方法,删掉node03 04 05的/tmp/hadoop-root/dfs下的文件,重新启动集群,成功
关闭集群:
node02: stop-dfs.sh
node02: stop-yarn.sh
(停止nodemanager)
node04,node05: yarn-daemon.sh stop resourcemanager
Node03、04、05:zkServer.sh stop
12. 在Windows下配置hadoop的环境
把hadoop压缩包解压安装
在右键此电脑选择属性
选择-高级系统设置-环境变量,添加HADOP_HOME环境变量,变量值为刚才hadoop安装路径
Path中添加
%HADOOP_HOME%\bin
添加HADOOP_USER_NAME,变量值为root
把haooop安装路径里的usr\hadoop-2.6.5\bin\hadoop.dll拷贝到C:\Windows\System32
安装ecipse-mars,此版本的eclipse带插件,可以可视化的看到hadoop的一些东西,比较方便,这个安装直接傻瓜式ok
如果eclipse界面下方没有小象图标,则做后续三步调出
在eclipse里把hadoop相关信息填一下
新建一个hadoop localtion
查一下哪个namenode是active就填哪个
这样在eclipse左侧列表的DFS location里新建一个目录,对应hdfs里也就建好了,可以用浏览器查看一下。
在eclipse里导入自己建一个包库
把jar包导入刚建的包库
把刚建的包库引入到project里
把JUnit包库引入到project里
利用xftp把hdfs-site.xml,core-site.xml等几个xml放到project的src目录。