Hadoop高可用

1.先实现node2免密登录node1

  在node2下执行:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

          cat id_dsa.pub >> authorized_keys

          scp id_dsa.pub node1:`pwd`/node2.pub

  在node1下执行:cat node2.pub >> authorized_keys

2.配置第二个NameNode节点

  vi hdfs-site.xml

  删除:

    <property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>node2:50090</value>
    </property>

  添加:

    <property>      # mycluster是nameservices的一个逻辑名
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>

    <property>      # nn1,nn2是namenodes的逻辑名

      <name>dfs.ha.namenodes.mycluster</name>

      <value>nn1,nn2</value> 

    </property>

    <property>   # 通过rpc映射nn1和物理机地址
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>node1:8020</value>
    </property>
    <property>  # 通过rpc映射nn2和物理机地址
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>node2:8020</value>
    </property>

    <property>   #  给浏览器访集群提供ip和端口
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>node1:50070</value>
    </property>
    <property>   #  给浏览器访集群提供ip和端口
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>node2:50070</value>
    </property>

    <property>    #  指明JNs集群部署在哪些节点上,即JNN主机位置

        <name>dfs.namenode.shared.edits.dir</name>

        <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>

    </property>

    <property>    #  实现故障转移时的代理位置

        <name>dfs.client.failover.proxy.provider.mycluster</name>    

        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

    </property>

    <property>     #  主NameNode出现故障后,备用NameNode通过秘钥登录主NameNode立刻关闭NameNode状态,自己接管变成主节点

        <name>dfs.ha.fencing.methods</name>

        <value>sshfence</value>

    </property>

    <property>

        <name>dfs.ha.fencing.ssh.private-key-files</name>

        <value>/root/.ssh/id_dsa</value>

    </property>

    <property>  #  JNN保存日志的路径

        <name>dfs.journalnode.edits.dir</name>

        <value>/var/sxt/hadoop/ha/journalnode</value>

    </property>

    <property>  # 完成自动故障转移
      <name>dfs.ha.automatic-failover.enabled</name>
      <value>true</value>
    </property>

  vi core-site.xml

    修改:

    <property>

            <name>fs.defaultFS</name>

            <value>hdfs://node1:9000</value>

       </property>

    <property>

            <name>hadoop.tmp.dir</name>

            <value>/var/sxt/hadoop/full</value>

         </property>

    修改成:

    <property>

            <name>fs.defaultFS</name>

            <value>hdfs://mycluster</value>   # 修改成逻辑名

       </property>

    <property>

            <name>hadoop.tmp.dir</name>

            <value>/var/sxt/hadoop/ha</value>   # 修改路径为ha

         </property>

    <property>  # zookeep的集群的指定
      <name>ha.zookeeper.quorum</name>
      <value>node2:2181,node3:2181,node4:2181</value>
    </property>

3.进行分发

  执行:scp core-site.xml hdfs-site.xml node2:`pwd`

      scp core-site.xml hdfs-site.xml node3:`pwd`

      scp core-site.xml hdfs-site.xml node4:`pwd`

4.安装zookeeper

  进入node2(zookeeper安装在node2、node3、node4)

  tar zxvf zookeeper-3.4.6.tar.gz -C /opt/sxt/

  配置zookeeper:

    cd /opt/sxt/zookeeper-3.4.6/conf

    改文件名:mv zoo_sample.cfg zoo.cfg 

    vi zoo.cfg

    修改dataDir=/tmp/zookeeper为/var/sxt/zk

    再增加:   

      server.1=node2:2888:3888  # 指明zookeeper所在节点
      server.2=node3:2888:3888
      server.3=node4:2888:3888

  分发到node3和node4:

      scp -r zookeeper-3.4.6/ node3:`pwd`

      scp -r zookeeper-3.4.6/ node4:`pwd`

5.创建步骤4增加的路径/var/sxt/zk

  mkdir -p /var/sxt/zk

  echo 1 > /var/sxt/zk/myid

  上面2步操作需要在node3和node4上也执行一遍,分别echo 2和echo 3

6.配置zookeeper环境变量

  vi + /etc/profile

  增加:

    export ZOOKEEPER_HOME=/opt/sxt/zookeeper-3.4.6

  修改:

    PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

  分发文件:scp /etc/profile node3:/etc

       scp /etc/profile node4:/etc

  修改完全部读一下文件:  . /etc/profile

7.集群配置完毕

8.开启zookeeper

  执行:zkServer.sh start

  查看状态:zkServer.sh status    node4为主,node2,、node3为从

  关闭:zkServer.sh stop

9.启动JNN(journalnode)用于两个NameNode同步数据(注意:一定要先于集群格式化完成)

  在node1、node2、node3节点上执行:hadoop-daemon.sh start journalnode

10.运行JNN后,在node1或者node2上执行格式化操作,这里选择node1

  hdfs namenode -format

  再启动主节点:

   hadoop-daemon.sh start namenode

11.把格式化的主节点的元数据信息拷贝到备用主节点,确保步骤9、步骤10 已经完成

  再node2上执行:hdfs namenode -bootstrapStandby    以同步node1格式化后的元数据信息

12.active的节点(node1)在zookeeper服务器上完成注册,即在zookeeper服务器上创建一个节点

  执行:hdfs zkfc -formatZK

  成功后会自动在zookeeper客户端创建/hadoop-ha/mycluster

  查看:执行    zkCli.sh   进去zookeeper客户端,执行  ls /    查看

13.启动集群!!!

  在主节点node1执行: start-dfs.sh

 14.启动后查看各个节点的进程:执行jps

  在node4查看zookeeper客户端目录下的 /hadoop-ha/mycluster,会出现两个注册的节点[ActiveBreadCrumb, ActiveStandbyElectorLock],执行get /hadoop-ha/mycluster/ActiveBreadCrumb查看此节点下的数据

注意:关闭Hadoop集群和zookeeper集群后,在重新启动集群,只需要选启动zookeeper:zkServer.sh start,再启动Hadoop集群:start-dfs.sh即可,不需要再启动JNN集群,因为第一次搭建的时候已经创建了目录节点,start-dfs.sh会自动运行JNN

常用命令

  1)停止主节点守护进程(主节点down):hadoop-daemon.sh stop namenode

  2)启动主节点守护进程(主节点up):hadoop-daemon.sh start namenode

  3)停止主节点zkfc物理进程(不会down,状态会从active切换到standby):hadoop-daemon.sh stop zkfc

  4)关闭所有的角色进程:stop-dfs.sh

  5)启动集群角色进程:start-dfs.sh

  6)关闭zookeeper集群角色进程:zkServer.sh stop  

  7)进入zookeeper客户端:zkCli.sh

  8)

原文地址:https://www.cnblogs.com/yangyangming/p/12643289.html