zoukankan      html  css  js  c++  java
  • hadoop——高可用集群搭建的原理与方法

    一、首先谈一谈zookeeper的选举机制

    注:高可用集群中有两台机器作为namenode,无论在任何时候,集群中只能有一个namenode作为active状态,而另一个是standby状态,为了达到namenode快速容错的目的,引入zookeeper后,hadoop-ha可以在active的namenode出问题时由standby自动切换为active状态

    特征
    leader    投票发起和决议,更新系统状态(只能有一个,否则出现脑裂现象)
    follower    参与选举,处理并反馈客户请求

      为了保证zookeeper的可用性,集群中至少由3个zookeeper节点组成(确保某一节点死亡可以由选举机制从另外两个节点选出一个作为leader,对外继续提供服务,它的存活条件为半数以上的节点存活)

    选举机制如此例:

    预设5台:
      1、2分别启动后因为未过半都处于观望
      3启动后,1、2、3都选择3,数量过半因此3为leader,1、2为follower
      4、5启动后因为领导已经产生,则自动沦为follower
    

    二、zookeeper的配置

    # 需要提前准备好jdk环境
    # 解压步骤省略
    # 创建目录:
    mkdir zookeeper
    # 建立软连接:
    ln -s zookeeper345/ zookeeper/
    # 创建数据目录:
    mkdir zookeeper/zkdata
    # 修改zookeeper配置文件:
    cd /opt/bigdata/hadoop/zookeeper345/conf

    zoo.sample.cfg zoo.cfg--配置信息
    tickTime=2000	毫秒,服务器和客户端之间,服务器之间心跳间隔,最小超时为2倍
    initLimit=10	follower启动后与leader之间同步数据,并且确定可以对外服务状态的最大时限为10*tickTime
    syncLimit=5	follower和leader之间如果在syncLimit*tickTime时间内无法通过心跳确认,则leader判定该follower死亡,移出服务列表
    dataDir=/opt/bigdata/hadoop/zookeeper/zkdata
    clientPort=2181
    server.1=vwmaster:2888:3888
    server.2=vwslave01:2888:3888
    server.3=vwslave02:2888:3888
    server.4=vwslave03:2888:3888

    # 在zkdata目录中创建myid文件,并将当前host下对应的服务器编号1/2/3/4存在其中
    # 配置环境变量:
    export ZK_HOME=/opt/bigdata/hadoop/zookeeper345
    export PATH=$ZK_HOME/bin:$ZK_HOME/sbin:$PATH

    # 激活环境变量:
    source /etc/profile
    [root@vwslave01 ~]# zkServer.sh start

    三、高可用原理

      在高可用集群中有两个namenode,其中一个为active,另一个作为standby,active的namenode负责集群中所有的客户端操作,而原来的secondaryNamenode也不需要了,数据交互由轻量级进程journalNode完成,对于任何由主namenode的修改操作,standby的namenode监测到之后会同步journalnode里面的修改log,当active namenode挂了后会读取journalnode里面的修改日志,接替它的位置并保证数据的同步。

      而namenode的健康状态的判定由zookeeper决定,在每个namenode启动时,会在zookeeper上注册一个持久化节点,而zookeeper提供一个znode(独占锁)获取master的功能,两个namenode谁得到谁就是active状态,另一个保持standby,实际工作中hadoop会提供一个ZKFailoverControl角色在每个主节点周期性的探测namenode的健康状态,当它出问题了独占锁将会给备份的namenode代替原来的主机负责其职责

     四、搭建方法

    关于NameNode高可靠需要配置的文件有core-site.xml和hdfs-site.xml

    关于ResourceManager高可靠需要配置的文件有yarn-site.xml

    时间同步

      本地时钟服务器搭建

        rmp -qa|grep ntp

        yum -y remove ntpdate-4.2.6p5-29.e17.centos.x86_64

      安装ntp  yum -y install ntp

      修改所有节点的/etc/ntp.conf

        restrict 20.0.0.100 nomodify notrap nopeer noquery  //当前节点ip

        restrict 20.0.0.2 mask 255.255.255.0 nomodify notrap  //集群所在网段网关Gateway,子网掩码Netmask

      主节点

      #server 0.centos.pool.ntp.org iburst

      #server 1.centos.pool.ntp.org iburst

      #server 2.centos.pool.ntp.org iburst

      #server 3.centos.pool.ntp.org iburst

      server 127.127.1.0

      Fudge 127.127.1.0 stratum 10

      从节点

      #server 0.centos.pool.ntp.org iburst

      #server 1.centos.pool.ntp.org iburst

      #server 2.centos.pool.ntp.org iburst

      #server 3.centos.pool.ntp.org iburst

      server 20.0.0.100    //主节点ip

      Fudge 20.0.0.100 stratum 10

      启动ntp服务  service ntpd start

      设置开机启动  chkconfig ntpd on

      查看  ntpstat

    以下配置均为hadoop260/etc/hadoop目录下

    注:提前在hadoop260下建目录data(cd data, mkdir pids journalnode)

      hadoop core-site.xml配置

    <configuration>
      <!--设定集群访问路径:kbcluster-->
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://kbcluster</value>
      </property>
      <!--设定临时目录-->
      <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/bigdata/hadoop/hadoop260/data/tmp</value>
      </property>
      <!--设定zookeeper集群目录-->
      <property>
        <name>ha.zookeeper.quorum</name>
        <value>vwmaster:2181,vwslave01:2181,vwslave02:2181,vwslave03:2181</value>
      </property>
    </configuration>
    

      hadoop hdfs-site.xml

    <configuration>
      <!--设定文件块备份数-->
      <property>
        <name>dfs.replication</name>
        <value>2</value>
      </property>
      <!--设定集群服务名称:kbcluster-->
      <property>
        <name>dfs.nameservices</name>
        <value>kbcluster</value>
      </property>
      <!--设定集群kbcluster的namenode自定义名称列表-->
      <property>
        <name>dfs.ha.namenodes.kbcluster</name>
        <value>nn1,nn2</value>
      </property>
      <!--分别设定所有namenode名称列表的rpc访问地址-->
      <property>
        <name>dfs.namenode.rpc-address.kbcluster.nn1</name>
        <value>vwmaster:9000</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.kbcluster.nn2</name>
        <value>vwslave01:9000</value>
      </property>
      <!--分别设定所有namenode名称列表的http访问地址-->
      <property>
        <name>dfs.namenode.http-address.kbcluster.nn1</name>
        <value>vwmaster:50070</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.kbcluster.nn2</name>
        <value>vwslave01:50070</value>
      </property>
      <!--设定所有节点的共享编辑日志journal地址列表-->
      <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://vwmaster:8485;vwslave01:8485;vwslave02:8485;vwslave03:8485/kbcluster</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>
      <!--设定journal节点存储目录-->
      <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/bigdata/hadoop/hadoop260/data/journalnode</value>
      </property>
      <!--关闭权限检查-->
      <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
      </property>
      <!--启动client访问失败动态代理-->
      <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
      </property>
      <!--设置client访问失败自动切换代理-->
      <property>
        <name>dfs.client.failover.proxy.provider.kbcluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
    </configuration>
    

      hadoop yarn-site.xml

    <configuration>
      <!--设置nodemanager附属服务-->
      <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>
      <!--启用resourcemanager的高可用(ha)集群-->
      <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
      </property>
      <!--启用resourcemanager的集群标识-->
      <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>kbcluster-yarn</value>
      </property>
      <!--启用resourcemanager(ha)集群的resoucemanager名称列表-->
      <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
      </property>
      <!--分别设置resourcemanager(ha)集群的resoucemanager名称的hostname-->
      <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>vwmaster</value>
      </property>
      <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>vwslave01</value>
      </property>
      <!--设置resourcemanager(ha)集群的zookeepr集群地址列表-->
      <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>vwmaster:2181,vwslave01:2181,vwslave02:2181,vwslave03:2181</value>
      </property>
      <!--启用resourcemanager(ha)集群可恢复功能-->
      <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
      </property>
      <!--指定resourcemanager(ha)集群的状态信息存储在zookeepr集群-->
      <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
      </property>
    </configuration>
    

      初始化hadoop ha集群

      分别启动所有节点上的journalnode服务   hadoop-daemon.sh start journalnode

      nn1上格式化  hdfs namenode -format  hadoop-daemon.sh start namenode(启动主节点)

      nn2上同步nn1上的元数据信息   hdfs namenode -bootstrapStandby  hadoop-daemon.sh start namenode #启动后通过网页测试

      nn1上启动hadoop ha集群  start-all.sh

      单独启动nn2上的resourcemanager  yarn-daemon.sh start resourcemanager

      网页上可查状态  ip:50070

    图片来源博客:https://cloud.tencent.com/developer/article/1121864

  • 相关阅读:
    oracel与mysql 查询从创建时间到更新时间的3天内的数据
    微信创建菜单
    利用XStream实现实体类与xml的转换
    play freamwork 框架中 调用线程保存数据
    play freamwork 框架中 设置文件大小
    将javabean转为map类型,然后返回一个map类型的值
    Base64的加密,解密
    MD5加密
    实体类与CDATA类型的xml的转换的工具类
    解决oracle数据库中 ORA-01843: 无效的月份问题
  • 原文地址:https://www.cnblogs.com/afeiiii/p/13579494.html
Copyright © 2011-2022 走看看