zoukankan      html  css  js  c++  java
  • 11-hdfs-NameNode-HA-wtihQJM解决单点故障问题

    在hdfs中, NN只有一个, 但其中保存的数据尤其重要, 所以需要将元数据保存, 其中源数据有2个形式, fsimage 和 edit文件, 最简单的解决方法就是复制fsimage, 并在文件修改时同时修改 NNActive 和 NNStandby 中的edit, 保存在第三方的QJM中, 所以多个NN除了active接受用户请求外, 无其他区别

     首先是, 集群规划: 

    可以看到NN是有1和2组成active和standby的, 之前说过NN需要有DNN免密登录的权限, 所以, 两台分别设置其他三台的免密登录

    1, 多台NN间切换, 通过zookeeper来实现的

     1) 安装zookeeper.3.4.6.tar.gz, 并创建 conf/zoo.cfg文件

    tickTime=2000
    dataDir=/var/lib/zookeeper
    clientPort
    =2181 initLimit=5 syncLimit=2 server.1=192.168.208.106:2888:3888 server.2=192.168.208.107:2888:3888 server.3=192.168.208.108:2888:3888

    2), 创建data目录和log目录(mkdir -p)

    3), 在 ${dataDir}/下面 配置节点信息 myid, 跟上面的server.x保持一致

    1
    2
    3

    4), 启动, cd /usr/opt/zookeeper3.4.6/bin

    zkServer.sh start

    5), 链接内存数据库, 通过get 和ls 等命令可查看数据库中的内容

    zkCli.sh

    zookeeper启动后, 就不要关闭了...

    zk启动脚本: 

    脚本启动不管用的, 把环境变量配置在 ~/.bashrc下, 因为ssh分为登陆和非登陆, 读取配置文件的顺序不同

    #!/bin/bash                                                                                                                                                                                                     
    host=(node2 node3 node4)
    
    start() {
      for i in ${host[@]}
      do
        echo start $i
        ssh -o StrictHostKeyChecking=no root@$i "/usr/local/zookeeper-3.4.11/bin/zkServer.sh start"
        ssh -o StrictHostKeyChecking=no root@$i "jps"
        echo start $i done
     done
    }
    
    stop() {
     for i in ${host[@]}
     do
        echo stop $i
        ssh -o StrictHostKeyChecking=no root@$i "/usr/local/zookeeper-3.4.11/bin/zkServer.sh stop"
        ssh -o StrictHostKeyChecking=no root@$i "jps"
        echo stop $i done
     done
    }
    
    case "$1" in
    
      start)
        start
      ;;
    
      stop)
        stop
      ;;
    
      *)
        echo "Usage: start|stop"
      ;;
    
    esac

    2, 修改hdfs的配置文件

    2.1), 删除masters, 不需要SNN了

    rm -rf /usr/opt/hadoop-2.5.1/etc/hadoop

    2.2) 删除原集群中的数据文件 

    rm -rf /opt/hadoop

    2.3) hdfs-site.xml

    servername, zookeeper 使用

    <property>
      <name>dfs.nameservices</name>
      <value>hdfscluster</value>
    </property>

    节点协议( 有几个nameNode定义几个)

    <property>
      <name>dfs.ha.namenodes.hdfscluster</name>
      <value>nn1,nn2</value>
    </property>

    rpc协议( 文件上传下载使用)

    <property>
      <name>dfs.namenode.rpc-address.hdfscluster.nn1</name>
      <value>192.168.208.106:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.hdfscluster.nn2</name>
      <value>192.168.208.107:8020</value>
    </property>

    http协议

    <property>
      <name>dfs.namenode.http-address.hdfscluster.nn1</name>
      <value>192.168.208.106:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.hdfscluster.nn2</name>
      <value>192.168.208.107:50070</value>
    </property>

    qjm节点, journalNodes节点, 用于缓存edits文件, uri, 分号隔开

    <property>
      <name>dfs.namenode.shared.edits.dir</name>  
     <value>qjournal://192.168.208.107:8485;192.168.208.108:8485;192.168.208.109:8485/hdfscluster</value> </property>

    帮助客户端获得activeNameNode

    <property>
      <name>dfs.client.failover.proxy.provider.hdfscluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    远程登陆, 需要ssh密钥文件

    <property>
      <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>

    journalNode 数据存放的目录

    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/journalNode/data</value>
    </property>

    2.4) core-site.xml, 修改下入口即可

    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://hdfscluster</value>
    </property>

    3, 启用自动切换

    3.1), hdfs-site.xml

    <property>
       <name>dfs.ha.automatic-failover.enabled</name>
       <value>true</value>
     </property>

    3.2), core-site.xml, 更改一个配置即可, hadoop.tmp.dir仍然保留

    <property>
       <name>ha.zookeeper.quorum</name>
       <value>192.168.208.106:2181,192.168.208.107:2181,192.168.208.108:2181</value>
     </property>

    4, 启动journalNode

    hadoop-daemon.sh start journalnode

    查看日志检查是否成功启动

    停止: hadoop-daemon.sh stop journalnode

    lgos/hadoop-root-journalnode-node4.log

    5, 格式化其中一个NN

    hdfs namenode -format

    6, 拷贝fsimage 到另一台 NN上, 或者手动拷贝过去也可以

    #启动刚刚格式化的NN
    hadoop-daemon.sh start namenode
    #在没有格式化的NN上执行
    hdfs namenode -bootstrapStandby
    #启动第二个NN
    hadoop-daemon.sh start namenode

    7, 初始化zookeeper, 在active的NN上执行

    hdfs zkfc -formatZK

    8, 启动

    start-dfs.sh

    排错时, 可用jps命令查看集群端口号, 然后kill -9, 或者 killall java

     ps: 记得上个博客的配置, slaves等

     以后启动时, 先启动3台zookeeper, 然后 start-dfs.sh 即可以了

    非常坑, 因为私钥文件root前面没有加 / 表明根目录, 卡了一个小时!!!!

    系列来自尚学堂

  • 相关阅读:
    今天开始用 VSU 2010
    Visual Studio 2010 模型设计工具 基本应用
    Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
    Enterprise Library 4.1 Security Block 快速使用图文笔记
    解决“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。”(图)
    一个Oracle存储过程示例
    Enterprise Library 4.1 Application Settings 快速使用图文笔记
    Oracle 10g for Windows 简体中文版的安装过程
    Oracle 11g for Windows 简体中文版的安装过程
    Oracle 9i 数据库 创建数据库 Net 配置 创建表 SQL查询 创建存储过程 (图)
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6636926.html
Copyright © 2011-2022 走看看