hadoop的高可用(HA)

>注:安装hadoop时,hadoop的安装包需要在jdk下编译,否则安装hadoop时,无法与jdk兼容。 >此配置为HDFS的HA和YARN的HA,规模为三台机器(hadoop1、hadoop2、hadoop3),其中hadoop1是HDFS集群的"active"的NameNode,hadoop2是HDFS集群的"standby"的NameNode,并且hadoop2同时也是Yarn集群的"standby"的ResourceManager,hadoop3是Yarn集群的"active"的ResourceManager,;并且所有操作先在一台机器上操作。

安装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管理界面)

猜你喜欢

转载自blog.csdn.net/weixin_38613375/article/details/89223363
今日推荐