hadoop 完全分布式HA高可用集群(自动切换)搭建

实验环境

namenode1: 192.168.103.4
namenode2: 192.168.103.8
datanode1:192.168.103.15
datanode2: 192.168.103.5 
datanode3: 192.168.103.3
操作系统: ubuntu-16.04-x64
hadoop版本: apache-hadoop-2.6.5
jdk版本:1.8

安装步骤

1.安装jdk

jdk的安装过程此处不赘述,不熟悉的话可以参考网上的资料。

搭建zookeeper集群

zookeeper集群的搭建过程可以参考这里,本例中zookeeper集群搭建在datanode1, datanode2,datanode3节点上。

2.修改主机映射并配置ssh免密码登录

为了方便配置信息的维护,我们在hadoop配置文件中使用主机名来标识一台主机,那么我们需要在集群中配置主机与ip的映射关系。
修改集群中每台主机/etc/hosts文件,添加如下内容。

192.168.103.4   namenode1
192.168.103.8   namenode2
192.168.103.15  datanode1
192.168.103.5   datanode2
192.168.103.3   datanode3

集群在启动的过程中需要ssh远程登录到别的主机上,为了避免每次输入对方主机的密码,我们需要对namenode1和namenode2配置免密码登录
在namenode1上生成公钥

ssh-keygen

一路enter确认即可生成对应的公钥。
将namenode1的公钥拷贝到namenode2, datanode1, datanode2, datanode3节点上。

ssh-copy-id  -i  ~/.ssh/id_rsa.pub  root@namenode2
ssh-copy-id  -i  ~/.ssh/id_rsa.pub  root@datanode1
ssh-copy-id  -i  ~/.ssh/id_rsa.pub  root@datanode2

在namenode2上生成公钥后,并将namenode2的公钥拷贝到namenode1, datanode1, datanode2, datanode3节点上。具体的命令可以参考namenode1上的操作命令。

3.namenode1配置hadoop,并复制到其余节点

下载hadoop 安装包,点击这里获取hadoop-2.6.5。

  • 解压安装包

    tar xf hadoop-2.6.5.tar.gz
    
  • 修改etc/hadoop/hadoop-env.sh

     export JAVA_HOME=/opt/jdk1.8.0_91
    
  • 修改etc/hadoop/core-site.xml

    <property>
         <name>fs.defaultFS</name>
         <value>hdfs://mycluster</value>
     </property>
     <property>
         <name>hadoop.tmp.dir</name>
         <value>file:/opt/hadoop-2.6.5/tmp</value>
     </property>
     <property>
        <name>ha.zookeeper.quorum</name>
        <value>datanode1:2181,datanode2:2181,datanode3:2181</value>
     </property>
    

    ha.zookeeper.quorum为zookeeper集群的地址

  • 修改etc/hadoop/hdfs-site.xml

    <property>
         <name>dfs.namenode.name.dir</name>
         <value>file:/opt/hadoop-2.6.5/tmp/dfs/name</value>
     </property>
     <property>
         <name>dfs.datanode.data.dir</name>
         <value>file:/opt/hadoop-2.6.5/tmp/dfs/data</value>
     </property>
     <property>
         <name>dfs.replication</name>
         <value>3</value>
     </property>
    
     <!--HA配置 -->
     <property>
         <name>dfs.nameservices</name>
         <value>mycluster</value>
     </property>
     <property>
         <name>dfs.ha.namenodes.mycluster</name>
         <value>nn1,nn2</value>
     </property>
     <!--namenode1 RPC端口 -->
     <property>
         <name>dfs.namenode.rpc-address.mycluster.nn1</name>
         <value>namenode1:9000</value>
     </property>
     <!--namenode1 HTTP端口 -->
     <property>
         <name>dfs.namenode.http-address.mycluster.nn1</name>
         <value>namenode1:50070</value>
     </property>
     <!--namenode2 RPC端口 -->
     <property>
         <name>dfs.namenode.rpc-address.mycluster.nn2</name>
         <value>namenode2:9000</value>
     </property>
      <!--namenode1 HTTP端口 -->
     <property>
         <name>dfs.namenode.http-address.mycluster.nn2</name>
         <value>namenode2:50070</value>
     </property>
      <!--HA故障切换 -->
     <property>
         <name>dfs.ha.automic-failover.enabled.cluster</name>
         <value>true</value>
     </property>
     <!-- journalnode 配置 -->
     <property>
         <name>dfs.namenode.shared.edits.dir</name>
         <value>qjournal://datanode1:8485;datanode2:8485;datanode3:8485/mycluster</value>
     </property>
     <property>
         <name>dfs.client.failover.proxy.provider.mycluster</name>
         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
     </property>
     <!--发生failover时,Standby的节点要执行一系列方法把原来那个Active节点中不健康的NameNode服务给杀掉,
     这个叫做fence过程。sshfence会通过ssh远程调用fuser命令去找到Active节点的NameNode服务并杀死它-->
     <property>
         <name>dfs.ha.fencing.methods</name>
         <value>shell(/bin/true)</value>
      </property>
       <!--SSH私钥 -->
      <property>
          <name>dfs.ha.fencing.ssh.private-key-files</name>
          <value>/root/.ssh/id_rsa</value>
      </property>
     <!--SSH超时时间 -->
      <property>
          <name>dfs.ha.fencing.ssh.connect-timeout</name>
          <value>30000</value>
      </property>
      <!--Journal Node文件存储地址 -->
      <property>
          <name>dfs.journalnode.edits.dir</name>
          <value>/opt/hadoop-2.6.5/tmp/journal</value>
      </property>
    
  • 修改etc/hadoop/slaves

    datanode1
    datanode2
    datanode3
    
  • 将配置好的hadoop安装包拷贝到namenode2和其余的datanode上

     scp -r hadoop-2.6.5  root@namenode2:/opt
     scp -r hadoop-2.6.5  root@datanode1:/opt
     scp -r hadoop-2.6.5  root@datanode2:/opt
     scp -r hadoop-2.6.5  root@datanode3:/opt
    

4.启动集群

  • 启动zookeeper集群
    在datanode1,datanode2, datanode3节点执行如下命令:

    ./bin/zkServer.sh start
    
  • 格式化zk集群
    namenode1上执行:

     /bin/hdfs zkfc -formatZK
    
  • 启动journalnode集群
    datanode1, datanode2, datanode2上执行:

     ./sbin/hadoop-daemon.sh  start journalnode
    
  • 格式化namenode
    namenode1上执行:

     ./bin/hdfs namenode -format
    
  • 启动datanode
    datanode1, datanode2, datanode3上执行:

     ./sbin/hadoop-daemon.sh start datanode
    
  • 启动namenode
    namenode1:

     ./sbin/hadoop-daemon.sh start namenode
    

    namenode2:

    ./bin/hdfs namenode -bootstrapStandby
    ./sbin/hadoop-daemon.sh start namenode
    

    此时namenode1和namenode2同时处于standby状态。
    这里写图片描述
    这里写图片描述

  • 启动zkfc服务
    在namenode1和namenode2上同时执行如下命令:

    ./sbin/hadoop-daemon.sh  start zkfc
    

    启动zkfc服务后,namenode1和namenode2会自动选举出active节点
    这里写图片描述
    这里写图片描述

5.验证功能

root# ./bin/hdfs dfs -mkdir /test
root# ./bin/hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - root supergroup          0 2018-06-01 13:49 /test
root# ./bin/hdfs dfs -put /root/a.txt  /test
root# ./bin/hdfs dfs -cat   /test/a.txt 
hello world

HA故障自动切换

此时namenode1处于active状态,namenode2处于standby状态。模拟namenode1节点namenode服务挂掉。
namenode1:

root# jps
21235 DFSZKFailoverController
21116 Jps
20014 NameNode
root# kill -9 20014

我们再查看namenode2的节点状态
这里写图片描述

namenode2由standby状态切换到active状态,HA故障自动切换成功。

展开阅读全文

没有更多推荐了,返回首页