zoukankan      html  css  js  c++  java
  • 流式大数据计算实践(3)高可用的Hadoop集群

    一、前言

    1、上文中我们已经搭建好了Hadoop和Zookeeper的集群,这一文来将Hadoop集群变得高可用

    2、由于Hadoop集群是主从节点的模式,如果集群中的namenode主节点挂掉,那么集群就会瘫痪,所以我们要改造成HA模式(High Avaliable,高可用性)的集群,说白了就是设置一个备用的namenode节点,当线上使用的namenode挂掉后,会切换备用节点,让集群可以继续运行

    二、HA模式配置

    HA模式原理:比如设置两个namenode节点,一个active,一个standby(同时只能active一个namenode),集群运行中通过JournalNode来同步两个namenode节点的数据,通过Zookeeper来做节点维护,Zookeeper与节点之间存在一个心跳机制,当Zookeeper检测不到某个节点的心跳时,则认为节点挂掉了,就会启动切换机制

    1、首先配置journalnode集群 通信的超时时间,如果机器配置不好的情况下,连接时间会比较长,所以加大超时时间,生产环境尽量设置越小越好,这样检测故障也会更加及时

    vim /work/soft/hadoop-2.6.4/etc/hadoop/hdfs-site.xml
    
      <property>
        <name>dfs.qjournal.start-segment.timeout.ms</name>
        <value>60000</value>
      </property>

    2、failover配置----hdfs-site.xml配置

    (1)配置集群id

    (2)配置nodenode组的节点

    (3、4)配置每个namenode节点的rpc地址

    (5、6)配置每个namenode节点的控制台地址

    (7)配置journalnode集群的访问地址,由于我这里只有两台虚拟机,所以都加上去了,生产环境下,尽量将journalnode和namenode分开在不同的机器,因为一般namenode节点挂了,很可能是因为namenode所在的物理机本身存在一些问题导致,放在一起又会导致journalnode节点也挂掉

    (8)配置dfs客户端,用来判断哪个namenode是active的

    (9、10)配置结束namenode的方式:当检测到namenode挂掉并进行备用节点切换时,要将之前的namenode彻底干掉,因为要防止namenode的“假死”,比如namenode所在的机器可能由于网络不好被认为挂掉而切换了备用节点,当原namenode机器网络恢复,就会造成两个namenode同时工作,导致数据混乱,这就是所谓的“脑裂现象”。为了防止这个现象,当检测到namenode挂掉,那么就直接SSH连接到这台机器上,并将namenode直接kill掉,第10条配置就要指定当初配置SSH生成的私钥目录

    (11)配置journalnode的数据存放的文件夹(要记得去创建文件夹)

    vim /work/soft/hadoop-2.6.4/etc/hadoop/hdfs-site.xml
    
      <property>
        <name>dfs.nameservices</name>
        <value>stormcluster</value>
      </property>
      <property>
        <name>dfs.ha.namenodes.stormcluster</name>
        <value>storm1,storm2</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.stormcluster.storm1</name>
        <value>storm1:8020</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.stormcluster.storm2</name>
        <value>storm2:8020</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.stormcluster.storm1</name>
        <value>storm1:50070</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.stormcluster.storm2</name>
        <value>storm2:50070</value>
      </property>
      <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://storm1:8485;storm2:8485/stormcluster</value>
      </property>
      <property>
        <name>dfs.client.failover.proxy.provider.stormcluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
      <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_rsa</value>
      </property>
      <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/work/hadoop/jn</value>
      </property>

    3、failover配置----core-site.xml配置

    (1)将之前设置的defaultFS修改成我们刚刚配置的集群id

    vim /work/soft/hadoop-2.6.4/etc/hadoop/core-site.xml
    
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://stormcluster</value>
      </property>

    4、启动/停止journalnode

    $HADOOP_PREFIX/sbin/hadoop-daemon.sh start journalnode
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh stop journalnode

    5、启动后用jps命令看看journalnode节点是否存在

    6、将第一个namenode进行格式化

    hdfs namenode -format

    7、将第二个namenode初始化作为备份

    hdfs namenode -bootstrapStandby

    8、将第一个namenode的journode进行初始化

    hdfs namenode -initializeSharedEdits

    9、将两台机器的namenode启动

    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start namenode

    10、通过50070端口访问两台机的控制台,可以发现两个namenode都处于standby状态

    11、执行命令手动切换active节点,将storm1激活,storm2变成备份,刷新控制台,可以发现storm1变成了active,storm2依然是standby

    hdfs haadmin -failover storm2 storm1

    12、配置zkfc自动化切换

    (1)首先配置Zookeeper的超时时间,生产环境尽量设置小一些,及时判断是否宕机

    vim /work/soft/hadoop-2.6.4/etc/hadoop/core-site.xml
    
      <property>
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>30000</value>
      </property>

    (2)启动Zookeeper集群

    $ZOOKEEPER_HOME/bin/zkServer.sh start

    (3)配置自动化切换和Zookeeper集群的地址

    vim /work/soft/hadoop-2.6.4/etc/hadoop/hdfs-site.xml
    
      <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
      </property>
      <property>
        <name>ha.zookeeper.quorum</name>
        <value>storm1:2181,storm2:2181</value>
      </property>

    (4)初始化Zookeeper集群

    $HADOOP_PREFIX/bin/hdfs zkfc -formatZK

    (5)进入Zookeeper命令行查看目录,可以看到多了一个hadoop-ha,说明配置正确

    $ZOOKEEPER_HOME/bin/zkCli.sh

    ls /

    (6)我们把两台机的namenode都重启一下

    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs stop namenode
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start namenode

    (7)通过50070控制台可以看到两台都处于standby状态(如果namenode起不来,就格式化一下)

    (8)启动zkfc

    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc

    (9)用jps命令可以看到新的进程

    (10)刷新50070控制台,可以发现有一台namenode已经变成了active

    三、总结

    1、到此我们的Hadoop集群已经搭建完毕,终于可以开始使用HBash了,要注意当前集群节点的启动顺序

    zookeeper-->journalnode-->namenode-->zkfc-->datanode

    2、以下是按照启动顺序的启动命令总结

    $ZOOKEEPER_HOME/bin/zkServer.sh start
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh start journalnode
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start namenode
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start datanode

    3、以下是按照启动顺序的停止命令总结

    $ZOOKEEPER_HOME/bin/zkServer.sh stop
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh stop journalnode
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs stop namenode
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs stop zkfc
    $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs stop datanode

     4、经常遇到namenode或者datanode起不来,可以删除数据目录,再执行格式化命令

    rm -rf /work/hadoop/nn/*
    rm -rf /work/hadoop/dn/*
    
    hdfs namenode -format
  • 相关阅读:
    【35.39%】【hdu 3333】Turing Tree
    【???】【???】小麦亩产一百八
    【心情】NOIP2014记忆
    【???】【???】了不起的郁杨
    【45.61%】【codeforces 701D】As Fast As Possible
    js如何找到方法在哪个js文件
    sql报句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))
    webform的页面缓存
    KindleEditor上传文件报404
    什么是publickeytoken及publickeytoken的作用
  • 原文地址:https://www.cnblogs.com/orange911/p/9994092.html
Copyright © 2011-2022 走看看