zoukankan      html  css  js  c++  java
  • 大数据 Hadoop HA

    Hadoop NameNode 高可用

    官方网站

    namenode可以手动进行切换也可以使用zookeeper进行自动的切换,下面只有第二种方法。

    配置zookeeper

    基本环境配置

    此时存在多台namenode,这些namenode之间需要进行免密配置。

    修改配置文件

    1. hdfs-site.xml

    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
        <!-- 取消安全模式-->
        <property>
            <name>dfs.permissions.enabled</name>
            <value>false</value>
        </property>
        <property>
            <name>dfs.namenode.http-address</name>
            <value>node1:50070</value>
        </property>
        <property>
            <name>dfs.name.dir</name>
            <value>/opt/software/hadoop/hdfs/name</value>
        </property>
        <property>
            <name>dfs.data.dir</name>
            <value>/opt/software/hadoop/hdfs/data</value>
        </property>
        <!-- 完全分布式集群名称 -->
        <property>
            <name>dfs.nameservices</name>
            <value>mycluster</value>
        </property>
        <!-- 集群中NameNode节点都有哪些 -->
        <property>
            <name>dfs.ha.namenodes.mycluster</name>
            <value>nn1,nn2</value>
        </property>
    
        <!-- nn1的RPC通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.mycluster.nn1</name>
            <value>node1:8020</value>
        </property>
    
        <!-- nn2的RPC通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.mycluster.nn2</name>
            <value>node2:8020</value>
        </property>
    
        <!-- nn1的http通信地址 -->
        <property>
            <name>dfs.namenode.http-address.mycluster.nn1</name>
            <value>node1:50070</value>
        </property>
    
        <!-- nn2的http通信地址 -->
        <property>
            <name>dfs.namenode.http-address.mycluster.nn2</name>
            <value>node2:50070</value>
        </property>
    
        <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
        </property>
    
        <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
        <property>
            <name>dfs.ha.fencing.methods</name>
            <value>sshfence</value>
        </property>
    
        <!-- 使用隔离机制时需要ssh无秘钥登录-->
        <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/home/ifan/.ssh/id_rsa</value>
        </property>
    
        <!-- 关闭权限检查-->
        <property>
            <name>dfs.permissions.enable</name>
            <value>false</value>
        </property>
    
        <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
        <property>
            <name>dfs.client.failover.proxy.provider.mycluster</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <!-- 启用自动切换 -->
        <property>
            <name>dfs.ha.automatic-failover.enabled</name>
            <value>true</value>
        </property>
    </configuration>
    
    

    2.core-stite.xml

    <configuration>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/software/hadoop/tmp</value>
        </property>
        
        <property>
            <name>fs.trash.interval</name>
            <value>10080</value>
        </property>
        <!-- 把两个NameNode)的地址组装成一个集群mycluster -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://mycluster</value>
        </property>
        <!-- 声明journalnode服务本地文件系统存储目录-->
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/opt/software/hadoop/hdfs/jn</value>
        </property>
        <!-- 实现自动切换使用的zk地址 -->
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>node1:2181,node2:2181,node3:2181</value>
        </property>
    </configuration>
    

    启动启动服务

    1. 在所有的机器上启动 journalnode

    sbin/hadoop-daemon.sh start journalnode
    

    2. 启动 namenode

    # 初始化HA在zk中的状态
    bin/hdfs zkfc -formatZK
    # 在nn1上对其进行格式化并启动 仅在第一次启动的时候执行,因为会初始化hdfs的
    bin/hdfs namenode -format
    sbin/hadoop-daemon.sh start namenode
    
    # 在 nn2 同步 nn1 的元数据信息并启动
    bin/hdfs namenode -bootstrapStandby
    sbin/hadoop-daemon.sh start namenode
    

    3. 在nn1上启动所有的datanode

    ./sbin/hadoop-daemons.sh start datanode
    

    4. 如果无法自动切换,可以尝试

    sudo yum install psmisc
    

    5. 之后启动

    ./sbin/start-dfs.sh
    
    6. 查看是否时Activate
    bin/hdfs haadmin -getServiceState nn1
    

    namenode 如何实现自动切换

    工作方式

    1. 内存中各自保存了一份元数据
    2. Edits日志只有Activate状态的namenode节点可以进行写操作
    3. 两个namenode都可以读取edits
    4. 共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现 )
    5. 状态管理功能模块(实现了一个zkfailover,常驻在每个namenode所在的节点,每一个zkfailover负责见监控自己所在的namenode节点,利用zk进行状态标识,当需要进行状态切换时,利用zkfailover来负责切换,切换时需要防止脑裂的情况发生)
      1. 利用zk实现了一个分布式锁,只有获取到锁的namenode才是activate状态的,如果崩溃则失去锁,则另一个namenode才能获取锁,进而从standby状态转换成activate状态。
      2. 如果zkfc检测到了假死,通知另一台机器的namenode的zkfc,另一台机器的zkfc强制杀死namenode,防止脑裂,kill -9 命令,激活本台机器的namenode,切换为activate
  • 相关阅读:
    jsp 特殊标签
    poj 1753 Flip Game 高斯消元 异或方程组 求最值
    zoj 3155 Street Lamp 高斯消元 异或方程组 求方案数
    poj1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组 模板
    zoj 3930 Dice Notation 模拟
    zoj 3157 Weapon 线段树求逆序对数
    hdu 1242 Rescue BFS+优先队列
    hdu 3466 Proud Merchants 贪心+01背包
    zoj 3689 Digging 贪心+01背包
    hdu 2602 Bone Collector 01背包模板
  • 原文地址:https://www.cnblogs.com/iFanLiwei/p/12811640.html
Copyright © 2011-2022 走看看