安装部署Hadoop HA

              写在前面,我才疏学浅,希望各位大牛批评指正,本着虚心接受的态度分享这篇文章!

## 1 **实验目的**

 

• 了解Hadoop HA的安装方式
• 掌握Hadoop HA安装部署方法

 

## 2 Hadoop HA模式规划

机器名 机器IP 用途 描述 进程数量
master 192.168.122.xxx 主节点 64位Centos7 7
slave1 192.168.122.xxx 从节点1 64位Centos7 7
slave2 192.168.122.xxx 从节点2 64位Centos7 4


## 3 实验描述


本实验以3个节点的集群为例,详细介绍Hadoop HA集群搭建过程。


## 4 部署Hadoop完全式前置配置

 

4.1前置基础配置参考【4.1--4.5步】:

      https://blog.csdn.net/weixin_43209528/article/details/106793613

4.2配置zookeeper

这里配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为active状态。

  • 上传zk安装包到~/目录下
  • 解压 tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local
  • 配置环境变量

       export ZOOKEEPER_HOME=/usr/local/

       export PATH=$PATH:$ZOOKEEPER_HOME/bin

  •     创建zoo.cfg 文件,并修改配置

      cd  .../zookeeper/conf/

      cp  zoo_sample.cfg  zoo.cfg

     vi  zoo.cfg

修改     dataDir=/usr/local/zookeeper/data

新增:    server.1=master:2888:3888

         server.2=slave1:2888:3888

         server.3=slave2:2888:3888    
  • 在zk目录下创建文件夹data

 mkdir  data

在data目录下创建文件myid,值为1

 vi  myid

增加 :  1

  • 把zk目录复制到另外两个节点slave1,slave2上。

scp -r /usr/local/zookeeper  slave1:/usr/local

scp -r /usr/local/zookeeper  slave2:/usr/local

  • 远程登录slave1和slave2,把slave1和slave2节点上的myid分别改为2和3,

ssh slave1

vi /usr/local/zk/data/myid  //修改内容为2

  • 在每个节点配置环境变量,并使其生效
  • zookeeper集群启动和检验

启动,在三个节点上分别执行命令zkServer.sh start

检验,在三个节点上分别执行命令zkServer.sh status

其中一个从节点为leader  其余都是follower

关闭 在三个节点上分别执行命令zkServer.sh stop

用jps查看进程:都启动QuorumPeerMain

4.3将hadoop添加到环境变量中

     export  HADOOP_HOME=/usr/local/hadoop

     export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

     source /etc/profile


## 5 安装配置Hadoop HA

5.1修改Hadoop配置文件

cd /usr/local/hadoop/etc/hadoop

要配置haoop-env.sh和yarn-env.sh的Java_Home不然Journalnode起不来

vi haoop-env.sh

export  JAVA_HOME=/usr/local/jdk

vi yarn-env.sh

export  JAVA_HOME=/usr/local/jdk

vi core-site.xml

<configuration>
    <!--集群名称在这里指定!该值来自于hdfs-site.xml中的配置-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
    <!--这里的路径默认是NameNode、DataNode、JournalNode 等存放数据的公共目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
    <!--ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>

vi hdfs-site.xml

<configuration>
    <!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
    <!--mycluster下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
    <!--nn1的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:9000</value>
</property>
    <!--nn1的http通信地址-->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:50070</value>
</property>
    <!--nn2的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name> 
<value>slave1:9000</value>
</property>
    <!--nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
    <!--指定NameNode的edits元数据在JournalNode上的存放 位置-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/ mycluster</value>
</property>
    <!--指定JournalNode在本地磁盘存放数据的位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/journaldata</value>
</property>
    <!--开启NameNode失败自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</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
shell(/bin/true)
</value>
</property>
    <!--使用sshfence隔离机制时需要ssh免登陆-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
    <!--配置sshfence隔离机制超时时间-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>

cp  mapred-site.xml.template mapred-site.xml

vi mapred-site.xml            

<configuration>
    <!--指定mr框架为yarn方式-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
    <!--配置历史服务-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
    <!--配置历史服务webapp端口-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>

vi 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>yarn-cluster</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>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
    <!--指定zk集群地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave1:8088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

vi slaves

master
slave1
slave2

 

5.2 在master将修改好的Hadoop分发到slave1,slave2节点

    scp -r /usr/local/hadoop hadoop@slave1:/usr/local

    scp -r /usr/local/hadoop hadoop@slave2:/usr/local

 

5.3 参考之前的方式,在slave1,slave2配置环境变量

5.4 启动高可用集群

  • 之前zk已经启动了现在在master,slave1,slave2上面手动启动journalnode

hadoop-daemon.sh start journalnode

 

  • hdfs namenode -format(只master)

 

  • 格式化后会在根据core-site.xml中的hadoop.tmp.dir配置的目录下生成个hdfs初始化文件,把hadoop.tmp.dir配置的目录下所有文件拷贝到另一台namenode节点所在的机器

scp -r /usr/local/hadoop/tmp hadoop@slave1:/usr/local/hadoop/

 

  • 格式化ZKFC

hdfs zkfc -formatZK(在master上执行即可)

启动zkfc:hadoop-daemon.sh start zkfc(namenode台)

 

  • 启动hdfs:start-dfs.sh(master)

启动yarn:start-yarn.sh

 

  • 启动备用yarn

yarn-daemon.sh start resourcemanager(slave1)

 

5.5 集群进程分布如下:

master

[root@master sbin]# jps
2001 DFSZKFailoverController
2562 NameNode
1411 JournalNode
2599 Jps
1370 QuorumPeerMain
1691 DataNode
2219 NodeManager
2110 ResourceManager

 

slave1

[root@slave1 ~]# jps
1520 NameNode
1680 DFSZKFailoverController
1458 JournalNode
1812 ResourceManager
2054 Jps
1419 QuorumPeerMain
1755 NodeManager
1580 DataNode

 

slave2

[root@slave2 ~]# jps
1648 NodeManager
1538 DataNode
1463 JournalNode
1818 Jps
1422 QuorumPeerMain
 

 

  补充:

1、 HA严格来说应该分成各组件的HA,hdfs的HA和yarn的HA

       hdfs-HA工作机制:通过双namenode清除单节点故障

2、工作要点

  1)元数据管理方式改变:只有active的namenode可以对edits做写操作 ,两个namenode都可以读取edits

 共享的edits放在一个共享存储中管理(qjournal和NFS)

        dfs.namenode.shared.edits.dir

        qjournal://master:8485;slave1:8485;slave2:8485/cluster1

    QJM(Quorum Journal Manager) 默认共享存储实现

  2)需要一个状态管理功能模块:zkfailover,常驻namenode节点,发生故障时进行切换

  3)保证两个namenode间ssh无密码登录

  4)隔离机制,fence,同一时刻只能有一个namenode提供服务

3、HDFS-HA自动故障转移机制

  增加两个组件zookeeper和ZKFailoverController(ZFKC)

  zkfc时zookeeper的客户端,负责检测监视转移故障

同时出现两个active状态的namenode术语叫脑裂brain split,防止brain split的两种方式,ssh发送kill指令(ssh kill -9 XXX)和调用用户自定义脚本程序。

 

 

 

 

 

 

上一篇:hue集成hadoop和yarn


下一篇:redis-ha手动切换slave节点为master