前言:
一、概述
集群规模
大致步骤
①、上传解压重命名环境变量source生效
②、修改配置文件
hadoop-env.sh
yarn-env.sh
hdfs-site.xml
core-site.xml
mapred-site.xml
yarn-site.xml
slaves (直接翻译为“奴隶”,作用是:用来标识从节点的ip地址的别名)
③启动集群
④验证并完善shell脚本
二、实操开始
前提(准备)
jdk、hadoop、zk、三台机器
删除我以前的普通hadoop文件
配置Myslave01root到Myslave01、Myslave02的免密登陆
原因→我们的Myslave01是我们的第二个NameNode设计的节点有必要设置免密登陆
这里我主机名打成slave01所以第一次出错了
解压重命名→环境已经配置了就不用配置了前提是你的目录是一样的
[root@Mymaster soft]# tar -zxvf hadoop-2.7.6.tar.gz -C ../
。。。。。。。。
修改配置文件
还记得前面介绍的notepad++吗?现在的配置文件多而且乱,建议使用它来操作
hdfs→core-site.xml, hdfs-site.xml,slaves
hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!--
nn1的RPC通信地址, hadoop version 1,
hdfs协议,NameNode进程的端口号是:9000,hadoop2 :8020
-->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>Mymaster:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>Mymaster:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>Myslave01:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>Myslave01:50070</value>
</property>
<!-- 指定NameNode的edits数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://Mymaster:8485;Myslave01:8485;Myslave02:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop-repo/journal</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop-repo/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop-repo/data</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制占用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
ctrl + s保存
core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-repo/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>Mymaster:2181,Myslave01:2181,Myslave02:2181</value>
</property>
</configuration>
slaves
yarn→yarn-site.xml,mapred-site.xml
yarn-site.xml
<configuration>
<!-- 开启RM高可靠 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>Myslave01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>Myslave02</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>Mymaster:2181,Myslave01:2181,Myslave02:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启日志输出-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<!-- mr依赖的框架名称 yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- mr转化历史任务的rpc通信地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>Myslave01:10020</value>
</property>
<!-- mr转化历史任务的http通信地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Myslave01:19888</value>
</property>
<!-- 会在hdfs的根目录下面创建一个history的文件夹,存放历史任务的相关运行情况-->
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/history</value>
</property>
<!-- map和reduce的日志级别-->
<property>
<name>mapreduce.map.log.level</name>
<value>INFO</value>
</property>
<property>
<name>mapreduce.reduce.log.level</name>
<value>INFO</value>
</property>
</configuration>
搞定!!!!
删除以往其他节点的hadoop文件
[root@Mymaster hadoop-repo]# ssh Myslave01
Last login: Thu Feb 4 19:55:56 2021 from mymaster
[root@Myslave01 ~]# rm -rf /opt/hadoop
[root@Myslave01 ~]# rm -rf /opt/hadoop-repo/
[root@Myslave01 ~]# ssh Myslave02
Last login: Thu Feb 4 19:49:50 2021 from myslave01
[root@Myslave01 ~]# rm -rf /opt/hadoop
[root@Myslave01 ~]# rm -rf /opt/hadoop-repo/
同步到其他节点
[root@Mymaster hadoop]# scp -r /opt/hadoop/ root@Myslave01:/opt/hadoop/
。。。。。。。。
[root@Mymaster hadoop]# scp -r /opt/hadoop/ root@Myslave02:/opt/hadoop/
。。。。。。。。
[root@Mymaster hadoop]# ssh Myslave01 'source /etc/profile.d/bigdata-etc.sh '
[root@Mymaster hadoop]# ssh Myslave02 'source /etc/profile.d/bigdata-etc.sh '
启动集群
先启动我们的zk集群
启动JournalNode进程
格式化NomeNode
将Mymaster节点上NameNode进程格式化后产生的元数据信息跨节点拷贝到slave01上
在NameNode进程所处的任何一台节点上格式化zkfc(此处选用Mymaster节点)
一样的分开启动,在Mymaster先启动dfs
在Myslave01启动yarn
在Myslave02启动ResourceManager
ok!!!所有进程启动都没有问题!!!
三、验证
查看webNameNode状态
Mymaster的
Myslave01的
验证上传下载查看
相关操作
Mymasterweb查看
Myslave01web查看
验证yarn的可用性
ResourceManager的状态
并且http://Myslave02:8088/ →自动跳转到active状态的ResourceManager节点上
运行官方提供的案例之wordcount(用来统计hdfs指定目录下各个单词出现的次数)
[root@Mymaster input]# yarn jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount hdfs://Mymaster:8020/input hdfs://Mymaster:8020/output
mapreduce是比较慢的我们可以看到进度情况以及完成情况就是没有问题的
四、优化启动shell文件
myself-start-all.sh
#!/bin/sh
#①停止hadoop集群
#a)在Myslave02节点上关闭resourcemanager
ssh Myslave02 'yarn-daemon.sh stop resourcemanager'
# b)在Myslave01节点上执行stop-yarn.sh
ssh Myslave01 'stop-yarn.sh'
# c)在Mymaster节点执行stop-dfs.sh
ssh Mymaster 'stop-dfs.sh'
nodes=$(cat /opt/myself-shells/nodes)
#echo $nodes
#②停止zookeeper集群(通过循环来停止)
for zk in $nodes
do
ssh root@$zk 'zkServer.sh stop'
done
myself-stop-all.sh
#!/bin/sh
#①停止hadoop集群
#a)在Myslave02节点上关闭resourcemanager
ssh Myslave02 'yarn-daemon.sh start resourcemanager'
# b)在Myslave01节点上执行stop-yarn.sh
ssh Myslave01 'stop-yarn.sh'
# c)在Mymaster节点执行stop-dfs.sh
ssh Mymaster 'stop-dfs.sh'
nodes=$(cat /opt/myself-shells/nodes)
#echo $nodes
#②停止zookeeper集群(通过循环来停止)
for zk in $nodes
do
ssh root@$zk 'zkServer.sh stop'
done
关集群测试
开集群测试
五、验证HA可用
验证NameNode进程的HA
手动干掉处于active的NameNode→模拟active状态的NameNode突然宕机的情况
查看web情况可以看到我们的Myslave01的NameNode变成了active,master,通过http访问NameNode进程,会报错
当然这种情况的集群是没问题的增删改查等等
再次重启Mymaster节点的NameNode
查看web并不会变成active,可知状态切换的条件是处于active的节点宕机
验证ResourceManager进程的HA
手动干掉处于active的ResourceManager→模拟active状态的ResourceManager突然宕机的情况
查看ResourceManager web
运行mapreduce验证
略,正常的是可以运行的
重启ResourceManager
http://Myslave01:8088/ →自动跳转到active状态的ResourceManager节点上
完美搭建hadoopHA版本!!!!!!!!!!!!
最后,关闭集群