阿飞飞飞

学而时习之

导航

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

posted on 2020-08-28 23:03  阿飞飞飞  阅读(855)  评论(0编辑  收藏  举报