08 使用zookeeper保证namenode、resourcemanager的高可用性

上一篇文章,我们完成了hadoop的集群安装,但从机子的节点分布图中我们可以看到namenode只在master机子上存在,一旦该机子宕机,则HDFS停服,所以我们需要一种机制来保证namenode的高可用性,这种风险也存在于resourcemanager。本文将阐述使用zookeeper来保证namenode以及resourcemanager的高可用性。

1 系统、软件和约束前提

2 操作【所有操作都由root完成】

2.1 关闭所有节点服务【zk可以不关】,清空之前的数据

ssh master;
hadoop-2.5.2/sbin/stop-all.sh
cd hadoop-2.5.2/dfs;
rm -rf *
mkdir data
mkdir name
# 其他两台机子也做相同清空操作

2.2 在master修改配置文件并拷贝

  • 修改core-site.xml
<configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://master:9000</value>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>file:/root/hadoop-2.5.2/tmp</value>
                    <description>Abase for other temporary directories.</description>
            </property>

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://myha01/</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>
    <property>
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>5000</value>
    </property>
</configuration>
  • 修改hdfs-site.xml

<configuration>
<property>
                    <name>dfs.namenode.secondary.http-address</name>
                    <value>master:50090</value>
            </property>
            <property>
                    <name>dfs.replication</name>
                    <value>2</value>
            </property>
            <property>
                    <name>dfs.namenode.name.dir</name>
                    <value>file:/root/hadoop-2.5.2/dfs/name</value>
            </property>
            <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/root/hadoop-2.5.2/dfs/data</value>
            </property>

        <!-- /meservice为myha01,需要和core-site.xml中的保持一致 
                 dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。 
        配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。 
        例如,如果使用"myha01"作为nameservice ID,并且使用"nn1"和"nn2"作为NameNodes标示符 
    -->
    <property>
        <name>dfs.nameservices</name>
        <value>myha01</value>
    </property>

    <!-- myha01下面有两个NameNode,分别是nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.myha01</name>
        <value>nn1,nn2</value>
    </property>

    <!-- nn1的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.myha01.nn1</name>
        <value>master:9000</value>
    </property>

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

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

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

    <!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表 
                          该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId 
        journalId推荐使用nameservice,默认端口号是:8485 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave1:8485;slave2:8485/myha01</value>
    </property>

    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/root/hadoop-2.5.2/data/journaldata</value>
    </property>

    <!-- 开启NameNode失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置失败自动切换实现方式 -->
    <property>
        <name>dfs.client.failover.proxy.provider.myha01</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
        </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>

    <property>
        <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
        <value>60000</value>
    </property>
</configuration>
  • 修改yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>master</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>

    <!-- 开启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>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.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</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>
  • 修改slaves
master
slave1
slave2
  • 拷贝这些配置文件到其他机子
cd /root/hadoop-2.5.2/etc/hadoop
scp * slave1:$PWD
scp * slave2:$PWD

2.3 启动相关服务

  • 1 在master启动journalnode
cd /root/hadoop-2.5.2/sbin
./hadoop-daemons.sh start journalnode
  • 2 在master上格式化zkfc
cd /root/hadoop-2.5.2/bin
./hdfs zkfc -formatZK
  • 3 在master上格式化namenode
cd /root/hadoop-2.5.2/bin
./hdfs namenode -format
  • 4 在master上启动namenode
cd /root/hadoop-2.5.2/sbin
./hadoop-daemon.sh start namenode
  • 5 在slave1上启动standby的namenode
cd /root/hadoop-2.5.2/bin
./hdfs namenode -bootstrapStandby
cd /root/hadoop-2.5.2/sbin
./hadoop-daemon.sh start namenode
  • 6 在master上设置主
cd /root/hadoop-2.5.2/bin
./hdfs haadmin -transitionToActive --forcemanual nn1
  • 7 在master上启动datanode
cd /root/hadoop-2.5.2/sbin
./hadoop-daemons.sh start datanode
  • 8 在master上启动zkfc
cd /root/hadoop-2.5.2/sbin
./hadoop-daemons.sh start zkfc 
  • 9 在master和slave1上启动yarn
cd /root/hadoop-2.5.2/sbin
./start-yarn.sh

全部启动完毕,每个节点执行jps,进程信息如下:
master:

[root@master ~]# jps
14962 Jps
12474 NameNode
12161 JournalNode
12757 DataNode
14838 NodeManager
7930 QuorumPeerMain
13757 ResourceManager
13366 DFSZKFailoverController

slave1:

[root@slave1 ~]# jps
10564 DataNode
10378 NameNode
12161 NodeManager
8736 QuorumPeerMain
11231 DFSZKFailoverController
10159 JournalNode
12287 Jps
12673 ResourceManager

slave2:

[root@slave2 ~]# jps
12706 Jps
11449 NodeManager
10764 QuorumPeerMain
10884 JournalNode
11171 DataNode

2.4 测试

  • 测试namenode的高可用性
    在浏览器中输入http://192.168.100.201:50070/dfshealth.html#tab-overview,回车:standby节点
    在浏览器中输入http://192.168.100.203:50070/dfshealth.html#tab-overview,回车:
    active节点
    此时,在203节点上找到namenode的pid,kill此进程,如下图所示:
    杀掉主namenode
    再去访问http://192.168.100.201:50070/dfshealth.html#tab-overview:
    由之前的standby变成了active,备升级为主
  • 测试resourcemanager的高可用性
    作者的resourcemanager分别位于master以及slave1,请读者根据实际情况设置。按以下步骤操作:
  1. 在master上开始词频统计
  2. 在词频统计的过程中,杀掉master上的resourcemanager,词频统计还是会完成
  3. 说明resourcemanager的高可用性。
    至此,我们完成了namenode、resourcemanager的高可用性,并完成了测试。

猜你喜欢

转载自www.cnblogs.com/alichengxuyuan/p/12576943.html
08
今日推荐