Hadoop2.7.4搭建高可用HA集群

规划集群

master                        slave1                    slave2

NameNOde              Namenode             

JournalNode          JournalNode          JournalNode

DataNode                DataNode              DataNode 

ResourceManager   ResourceManager

zk                           zk                         zk

ZKFC                   ZKFC

nodeManager      nodeManager       nodeManager

最终启动集群查看到各个节点上的进程如下:

环境准备:

在原先已搭建好的Hadoop集群之上

有三个节点master\slave1\slave2,确保这三个节点之间正常通信

原先我的Hadoop集群是放在/usr/local/hadoop目录下,

现在我在/usr/local/目录下创建一个文件夹ha,用于存放Hadoop高可用环境

cd /usr/local
mkdir ha

将之前配置好的Hadoop环境拷贝到ha目录下

cp /usr/local/hadoop/ /usr/local/ha/

查看环境变量(重要)

进入到Hadoop的安装目录下:/usr/local/ha/hadoop

cd /etc/hadoop

我的环境变量配置文件是放在.bashrc文件中

vi .bashrc

将HADOOP_HOME改为现在的路径

export HADOOP_HOME=/usr/local/ha/hadoop

记得要source环境变量

source .bashrc

对于环境变量的修改每一个节点都要改,并且要记得source。

HDFS-HA手动故障转移(通常不采用)

1、配置core-site.xml

<!-- Put site-specific property overrides in this file. -->

<configuration>
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>

  <!-- 声明journalnode服务本地文件系统存储目录-->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/usr/local/ha/hadoop/data/jn</value>
  </property>

  <!-- 指定hadoop运行时产生文件的存储目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/ha/hadoop/data</value>
  </property>
</configuration>

2、配置hdfs-site.xml

<configuration>
 <property>
      <name>dfs.namenode.name.dir</name>
      <value>file://${hadoop.tmp.dir}/name</value>
 </property>
 <property>
      <name>dfs.datanode.data.dir</name>
      <value>file://${hadoop.tmp.dir}/data</value>
      <description>datanode的存放路径</description>
 </property>
 <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>${hadoop.tmp.dir}/jn</value>
 </property>

<!-- 完全分布式集群名称 -->
<property>
     <name>dfs.nameservices</name>
     <value>mycluster</value>
</property>

<!-- 集群中NameNode节点都有哪些 -->
<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:8020</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
     <name>dfs.namenode.rpc-address.mycluster.nn2</name>
     <value>slave1:8020</value>
</property>


<!-- nn1的http通信地址 -->
<property>
     <name>dfs.namenode.http-address.mycluster.nn1</name>
     <value>master:50070</value>
</property>

<!-- nn2的http通信地址 -->
<property>
     <name>dfs.namenode.http-address.mycluster.nn2</name>
     <value>slave1:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
     <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>
<!-- 访问代理类:client用于确定哪个NameNode为Active -->
<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>

<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
     <name>dfs.ha.fencing.ssh.private-key-files</name>
     <value>/root/.ssh/id_rsa</value>
</property>

<!-- 关闭权限检查-->
<property>

  <name>dfs.permissions.enable</name>
     <value>false</value>
</property>

<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
     <name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>

3、将配置好的文件分发到其他两个节点

4、手动启动HA集群

(1)在各个JournalNode节点上,输入以下命令启动journalnode服务

journalnode实现namenode上的edits文件的同步

hadoop-daemon.sh start journalnode

(2)在master节点上对namenode进行格式化,并启动

hdfs namenode -format

hadoop-daemon.sh start namenode

(3)在slave2节点上同步master的元数据信息,并启动namenode

hdfs namenode -bootstrapStandby

hadoop-daemon.sh start namenode

(4)这是去查看对应的web页面就可以看到两个namenode 都处于standby状态

(5)启动所有的datanode

hadoop-daemons.sh start datanode

(6)将master切换为Active状态

hdfs haadmin -transitionToActive master

(7)查看是否为Active

hdfs haadmin -getServiceState master

5、手动集群的缺点

在该模式下,即使现役的NameNode失效也并不会自动转移到待机的NameNode,并不能满足高可靠性,所以通常生产环境中并不会采用该模式

HDFS-HA 自动故障转移

借助zookeeper来实现自动故障转移。自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务

Zookeeper发挥的主要作用:

(1)集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

(2)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

ZKFC:自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程

1、配置Zookeeper集群

可以参考我主页的另一篇博客zookeeper

2、配置hdfs-site.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
 <property>
      <name>dfs.namenode.name.dir</name>
      <value>file://${hadoop.tmp.dir}/name</value>
 </property>
 <property>
      <name>dfs.datanode.data.dir</name>
      <value>file://${hadoop.tmp.dir}/data</value>
      <description>datanode的存放路径</description>
 </property>
 <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>${hadoop.tmp.dir}/jn</value>
 </property>

<!-- 完全分布式集群名称 -->
<property>
     <name>dfs.nameservices</name>
     <value>mycluster</value>
</property>

<!-- 集群中NameNode节点都有哪些 -->
<property>
     <name>dfs.ha.namenodes.mycluster</name>
     <value>nn1,nn2</value>
</property>

<!-- nn1的RPC通信地址 -->
<property>
     <name>dfs.namenode.rpc-address.mycluster.nn1</name>
     <value>192.168.182.10:8020</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
     <name>dfs.namenode.rpc-address.mycluster.nn2</name>
     <value>192.168.182.20:8020</value>
</property>



<!-- nn1的http通信地址 -->
<property>
     <name>dfs.namenode.http-address.mycluster.nn1</name>
     <value>master:50070</value>
</property>

<!-- nn2的http通信地址 -->
<property>
     <name>dfs.namenode.http-address.mycluster.nn2</name>
     <value>slave1:50070</value>
</property>



<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
     <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>
<!-- 访问代理类:client用于确定哪个NameNode为Active -->
<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>

<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
     <name>dfs.ha.fencing.ssh.private-key-files</name>
     <value>/root/.ssh/id_rsa</value>
</property>

<!-- 关闭权限检查-->
<property>

  <name>dfs.permissions.enable</name>
     <value>false</value>
</property>

<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
     <name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 设置自动故障转移 -->
<property>
     <name>dfs.ha.automatic-failover.enabled</name>
     <value>true</value>
</property>
</configuration>

3、配置core-site.xml文件

<configuration>
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>

  <!-- 声明journalnode服务本地文件系统存储目录-->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/usr/local/ha/hadoop/data/jn</value>
  </property>

  <!-- 指定hadoop运行时产生文件的存储目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/ha/hadoop/data</value>
  </property>
  <!-- 指定zkfc要链接的zkserver地址 -->
  <property>
  <name>ha.zookeeper.quorum</name>
  <value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>

4、分发到其他两个节点上

5、启动

(1)关闭所有的hdfs进程

stop-dfs.sh

(2)启动zookeeper集群

zkServer.sh start

(3)初始化HA在zookeeper中的状态

hdfs zkfc -formatZK

(4)启动HDFS服务

start-dfs.sh

(5)在各个节点上启动ZKFC(master和slave1)先在哪台机器启动,哪个机器的NameNode就是Active NameNode

hadoop-daemin.sh start zkfc

(6)验证:将ActiveNameNOde  kill掉,会发现备用的NameNode会自动变成Active状态

Yarn-HA高可用配置

1、机制:

利用zookeeper监控服务,Active ResourceManager会在Zookeeper上创建一个临时序号节点,并实时将其状态写入zookeeper节点上,一旦zookeeper发现ActiveResourceManager挂掉就立马通知StandbyResourceManager上线。

2、配置yarn-site.xml


<configuration>
   <property>  
     <name>yarn.nodemanager.resource.cpu-vcores</name>  
     <value>8</value>  
 </property>  
 <property>  
     <name>yarn.nodemanager.resource.memory-mb</name>  
     <value>8192</value>  
</property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!--启用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
 
    <!--声明两台resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
<!-- 指定主机名 -->
<!-- master配置 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master</value>
    </property>
    <!-- 指定web端口号 -->
     <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>master:8088</value>
    </property>
    <!-- 指定服务端口号 -->
    <!--  <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>master:8032</value>
    </property> -->
    <!-- 申请资源端口号 -->
    <!--  <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>master:8030</value>
    </property> -->
    <!-- nodemanager连接端口号 -->
     <!-- <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>master:8031</value>
    </property> -->
<!-- slave1配置 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave1</value>
    </property>
    <!-- 指定web端口号 -->
     <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>slave1:8088</value>
    </property>
    <!-- 指定服务端口号 -->
     <!-- <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>slave1:8032</value>
    </property> -->
    <!-- 申请资源端口号 -->
     <!-- <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>slave1:8030</value>
    </property> -->
    <!-- nodemanager连接端口号 -->
    <!--  <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>slave1:8031</value>
    </property> -->
 
    <!--指定zookeeper集群的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>

    <!--启用自动恢复--> 
    <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>

</configuration>

3、分发到其他节点

4、在上述HDFS高可用集群启动好的基础上启动yarn

在master节点上执行

start-yarn.sh

在slave1节点上执行(另一个resourcemanager是要单独启动的)

yarn-daemon.sh start resourcemanager

查看两个resourcemanager的服务状态,一个为Active,一个为 Standby

yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2

运行Web端页面,如果是master上的resourcemanager处于active状态,那么输入slave1:8088会直接跳转到master:8088.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值