安装zookeeper集群
https://blog.csdn.net/weixin_38613375/article/details/89205766
修改主机名和ip映射
[root@hadoop1 ~]# vi /etc/hosts
<!--虚拟机IP 映射名-->
192.168.233.128 hadoop1
192.168.233.129 hadoop2
192.168.233.130 hadoop3
注:搭建几台机器,此处就写几个"机器ip 映射"
安装jdk与hadoop
[root@hadoop1 usr]# mkdir java
[root@hadoop1 usr]# mkdir hadoop
[root@hadoop1 usr]# cd java
[root@hadoop1 java]# jdk-8u141-linux-x64.tar.gz
[root@hadoop1 java]# tar -zxvf jdk-8u141-linux-x64.tar.gz
[root@hadoop1 usr]# cd hadoop
[root@hadoop1 hadoop]# hadoop-2.7.3.tar.gz
[root@hadoop1 hadoop]# tar -zxvf hadoop-2.7.3.tar.gz
配置jdk与hadoop环境
[root@hadoop1 hadoop]# vim /etc/profile
[root@hadoop1 hadoop]# source /etc/profile
关联集群的映射
[root@hadoop1 hadoop]# vi /usr/hadoop/hadoop-2.7.3/etc/hadoop/slaves
#搭建几台电脑,此处就写几个映射
hadoop1
hadoop2
hadoop3
修改配置文件
[root@hadoop1 hadoop]# /usr/hadoop/hadoop-2.7.3/etc/hadoop
修改jdk的安装路径
[root@hadoop1 hadoop]# vi hadoop-env.sh
[root@hadoop1 hadoop]# vi core-site.xml
<!-- 指定hdfs的nameservice为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop数据存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>Indicates the number of retries a client will make to establish a server connection.</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
<description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.
</description>
</property>
[root@hadoop1 hadoop]# vi hdfs-site.xml
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式,zkfc -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
[root@hadoop1 hadoop]#cp mapred-site.xml.template mapred-site.xml
[root@hadoop1 hadoop]#vi mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
[root@hadoop1 hadoop]#vi yarn-site.xml
<!-- 开启YARN HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 启用自动故障转移 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定YARN HA的名称 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
</property>
<!-- 指定两个resourcemanager的名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主机 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<!-- 配置YARN的http端口 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop3:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop2:8088</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<!-- 配置zookeeper的存储位置 -->
<property>
<name>yarn.resourcemanager.zk-state-store.parent-path</name>
<value>/rmstore</value>
</property>
<!-- 开启yarn resourcemanager restart -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置resourcemanager的状态存储到zookeeper中 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 开启yarn nodemanager restart -->
<property>
<name>yarn.nodemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置nodemanager IPC的通信端口 -->
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:45454</value>
</property>
配置免密登录(所有机器都需要配置)
https://blog.csdn.net/weixin_38613375/article/details/89180346
将配置好的文件传送到其他机器
[root@hadoop1 hadoop]scp -r /usr/java root@hadoop2:/usr
[root@hadoop1 hadoop]scp -r /usr/java root@hadoop3:/usr
[root@hadoop1 hadoop]scp -r /usr/hadoop root@hadoop2:/usr
[root@hadoop1 hadoop]scp -r /usr/hadoop root@hadoop3:/usr
[root@hadoop1 hadoop]scp /etc/profile root@hadoop2:/etc/profile
[root@hadoop1 hadoop]scp /etc/profile root@hadoop3:/etc/profile
[root@hadoop2 hadoop]source /etc/profile
[root@hadoop3 hadoop]source /etc/profile
下载"psmisc"
在NameNode主、备节点上安装
[root@hadoop1 ~]# yum -y install psmisc
[root@hadoop2 ~]# yum -y install psmisc
在ResourceManager主、备节点上安装
[root@hadoop3 ~]# yum -y install psmisc
[root@hadoop2 ~]# yum -y install psmisc
如果不安装"psmisc",当主节点挂了之后,备份节点不能由"standby"状态变成"active"
查看各机器是否同步
[root@hadoop1 ~]# date
[root@hadoop2 ~]# date
[root@hadoop3 ~]# date
注:如果时间不同同步(即,即几台机器的时间相差超过1分钟的),在启动机器时,会报错。此时可以手动同步所有机器的时间(所有的机器都操作一遍)。如果时间同步,就不需要进行如下操作。
安装ntpdate工具
[root@hadoop1 ~]# yum -y install ntpdate
设置与网络时间同步
[root@hadoop1 ~]# ntpdate cn.pool.ntp.org
系统时间
[root@hadoop1 ~]# hwclock --systohc
[root@hadoop1 ~]# hwclock -w
注:将设置的时间写到机器的主板时钟中,二选一
启动集群
先启动zookeeper
在所有机器上分别启动"JournalNode"(日志管理集群)
[root@hadoop1 bin]# hadoop-daemon.sh start journalnode
[root@hadoop2 bin]# hadoop-daemon.sh start journalnode
[root@hadoop3 bin]# hadoop-daemon.sh start journalnode
在HDFS的主节点(hadoop1)上格式化zkfc(状态切换)
[root@hadoop1 sbin]# hdfs zkfc -formatZK
在HDFS的主节点(hadoop1)上格式化NameNode
[root@hadoop1 sbin]# hadoop namenode -format
在HDFS的主节点(hadoop1)上启动NameNode
[root@hadoop1 sbin]# hadoop-daemon.sh start namenode
在HDFS的从节点(hadoop2)上启动数据同步和standby的NameNode
[root@hadoop2 sbin]# hdfs namenode -bootstrapStandby
[root@hadoop2 sbin]# hadoop-daemon.sh start namenode
在hadoop1启动zkfc
[root@hadoop1 sbin]# hadoop-daemons.sh start zkfc
在hadoop1启动DataNode、SecondaryNameNode
[root@hadoop1 sbin]# hadoop-daemons.sh start datanode
[root@hadoop1 sbin]# hadoop-daemons.sh start secondarynamenode
在hadoop3启动yarn
[root@hadoop3 sbin]# start-yarn.sh
在hadoop2启动standby的ResourceManager
[root@hadoop2 sbin]# yarn-daemon.sh start resourcemanager
上面的操作复杂,但是只在第一次启动的时候,按照上面的操作;之后再次启动机器的时,只需要在"active"的NameNode节点和"active"的ResourceManager节点上使用如下操作即可:
<!--启动HDFS机器-->
[root@hadoop1 sbin]#start.dfs.sh
<!--关闭HDFS集群-->
[root@hadoop1 sbin]#stop.dfs.sh
<!--启动Yarn集群-->
[root@hadoop3 sbin]#start.yarn.sh
<!--启动Yarn的从节点-->
[root@hadoop2 sbin]#yarn-daemon.sh start resourcemanager
<!--关闭Yarn集群-->
[root@hadoop3 sbin]#stop.yarn.sh
注:“JournalNode"将日志也写在zookeeper集群中,以便将日志备份到standby的NameNode中。
zkfc的进程为"DFSZKFailoverController”,他是用来切换NameNode的状态的(即当一个"active"的NameNode跌宕后,他可以将"standby"的NameNode切换成"active"的NameNode),他有两种切换机制:“ssh kill -9"和"shell脚本”。
在"active"的NameNode跌宕后,"standby"的NameNode的zkfs发生一条命令("ssh kill -9"用于确保"active"的NameNode已经彻底跌宕),在接收到回应后,zkfs会将"standby"的NameNode切换成"active"的NameNode。
"shell脚本"是在网络不好的状态(即在"standby"的NameNode的zkfs接收不到自己发出命令的回应时,通过本地的shell脚本(系统自带的)来切换状态。
如果出现非正常停机,再次开启集群时,hdfs的进程都可以正常启动,但是 “zkfc"是无法启动的,如果想再次启动"zkfc"进程,应该关闭HDFS的所有进程,启动zookeeper集群,然后在"active"的NameNode的机器上再次格式化"zkfc”,再次启动HDFS集群时,"zkfc"进程就可以启动了。
验证是否启动成功
[root@hadoop1 hadoop]# jps
3713 QuorumPeerMain
3873 NameNode
4452 NodeManager
4550 Jps
3975 DataNode
4154 JournalNode
4284 DFSZKFailoverController
[root@hadoop2 hadoop]# jps
2898 NameNode
2968 DataNode
3049 JournalNode
3306 NodeManager
3483 Jps
3117 DFSZKFailoverController
3438 ResourceManager
2815 QuorumPeerMain
[root@hadoop3 hadoop]# jps
7937 NodeManager
7523 JournalNode
7126 QuorumPeerMain
7819 ResourceManager
7405 DataNode
8334 Jps
关闭防火墙
停止firewall
[root@hadoop3 hadoop]# systemctl stop firewalld
#禁止firewall开机启动
[root@hadoop3 hadoop]#systemctl disable firewalld.service
浏览器查看
http://ip地址:50070 (HDFS管理界面)
http://ip地址:8088 (yarn管理界面)