手把手搭建Hadoop-HA高可用分布式文件系统

背景

根据我们之前搭建的hadoop集群,都只有一个namenode,一个resourcemanager。一旦namenode挂了,整个hdfs就废了,因为namenode负责着元数据信息的管理,响应客户端。
如果是resourcemanager挂了,那么yarn也是废了,无法尽心资源调度,没办法跑mapreduce,spark等运算框架。

这种情况下就急需一个高可用的hadoop集群

前提

hadoop2.0中提供了一些特性如,HDFS HA、YARN等。在hadoop-2.6.4中加入了YARN HA

HA的运行机制

  1. hadoop-HA集群运作机制介绍
    

    所谓HA,即高可用(7*24小时不中断服务)
    实现高可用最关键的是消除单点故障
    hadoop-ha严格来说应该分成各个组件的HA机制–HDFS的HA、YARN的HA

  2.  HDFS的HA机制详解
    

    通过双namenode消除单点故障

    双namenode协调工作的要点:
    A、元数据管理方式需要改变:
    内存中各自保留一份元数据
    Edits日志只能有一份,只有active状态的namenode节点可以做写操作
    两个namenode都可以读取edits
    共享的edits放在一个共享存储中管理(qjoutnal和NFS两个主流实现)
    B、需要一个状态管理功能模块
    实现一个zkfailover,常驻在每一个namenode所在的节点
    每一个zkfailover负责监控自己所在namenode节点,利用zookeeper进行状态标识
    当需要进行状态切换时,由zkfailover来负责切换
    切换时需要防止brain split现象的发生
    这里的brain split也就是脑裂,在一些有状态的HA系统中,本来一个独立的节点,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏,这种情况称之为脑裂。防止脑裂有两种方式:1.ssh发送kill指令 2、调用用户自定义脚本程序

HADOOP-HA图解

手把手搭建Hadoop-HA高可用分布式文件系统_第1张图片

虚拟机规划

本次搭建使用三台虚拟机server1,server2,server3
担任角色:
    server1:NameNode、DFSZKFailoverController(zkfc)、ResourceManager、QuorumPeerMain、QuorumPeerMain、QuorumPeerMain
    server1:NameNode、DFSZKFailoverController(zkfc)、ResourceManager
    server2:DataNode、NodeManager

在/etc/hosts中配好地址和主机名映射关系
192.168.123.20 server1
192.168.123.21 server2
192.168.123.22 server3

安装zookeeper

在hadoop-ha中我们需要zookeeper来帮我们标识节点状态,动态选举节点

由于安装zookeeper不是本节重点,因此这里只提到安装zookeeper需要注意的一些细节(如果还有不懂的请留言,下次专门出一篇安装zookeeper的文章)

并且zookeeper是用于分布式协调服务,因此,推荐启动奇数台zookeeper。我们这里启动三个。

1.首先来到zookeeper配置文件目录

cd /usr/local/apps/zookeeper/conf
具体位置看你解压到哪个位置。

2.配置文件

根据上面的规划,我们是要在server1上启动三个zookeeper的伪分布式集群。
因此我们需要三个不同的配置文件
cp zoo_sample.cfg zk1.cfg
cp zoo_sample.cfg zk2.cfg
cp zoo_sample.cfg zk3.cfg

zk1.cfg

#指定数据文件夹和日志文件夹
dataDir=/usr/local/apps/zookeeper/data/zk1
dataLogDir=/usr/local/apps/zookeeper/log/zk1
#指定端口
clientPort=2181

#server.序号= (主机名, 心跳端口、数据端口)
server.1=192.168.123.20:1888:2888
server.2=192.168.123.20:3888:4888
server.3=192.168.123.20:5888:6888

zk2.cfg

dataDir=/usr/local/apps/zookeeper/data/zk2
dataLogDir=/usr/local/apps/zookeeper/log/zk2

clientPort=2182

#server.序号= (主机名, 心跳端口、数据端口)
server.1=192.168.123.20:1888:2888
server.2=192.168.123.20:3888:4888
server.3=192.168.123.20:5888:6888

zk3.cfg


dataDir=/usr/local/apps/zookeeper/data/zk3
dataLogDir=/usr/local/apps/zookeeper/log/zk3

clientPort=2183

#server.序号= (主机名, 心跳端口、数据端口)
server.1=192.168.123.20:1888:2888
server.2=192.168.123.20:3888:4888
server.3=192.168.123.20:5888:6888

在每一个数据文件夹中创建一个myid文件,内容为其对应的id号

echo "1" > /usr/local/apps/zookeeper/data/zk1/myid
echo "2" > /usr/local/apps/zookeeper/data/zk2/myid
echo "3" > /usr/local/apps/zookeeper/data/zk3/myid

启动

zkServer.sh start zk1.cfg
zkServer.sh start zk2.cfg
zkServer.sh start zk3.cfg

配置hadoop-ha

搭建hadoop-ha并不难,主要就是配置一大堆配置文件。下面看看要如何配置

配置core-site.xml



        
                fs.defaultFS
                hdfs://kris/
        

        
                hadoop.tmp.dir
                /home/hadoop/hadata/tmp
        

        
                hadoop.namenode.dir
                /home/hadoop/hadata/name
        

        
                hadoop.data.dir
                /home/hadoop/hadata/data
        

        
                ha.zookeeper.quorum
                server1:2181,server1:2182,server1:2183
        

配置hdfs-site.xml



        
                dfs.replication
                1
        

        
                dfs.nameservices
                kris
        

        
                dfs.ha.namenodes.kris
                nn1,nn2
        

        
                dfs.namenode.rpc-address.kris.nn1
                server1:9000
        

        
                dfs.namenode.http-address.kris.nn1
                server1:50070
        
        
                dfs.namenode.rpc-address.kris.nn2
                server2:9000
        
        
                dfs.namenode.http-address.kris.nn2
                server2:50070
        

        
                dfs.namenode.shared.edits.dir
                qjournal://server1:8485;server2:8485/kris
        

        
                dfs.namenode.edits.dir
                /home/hadoop/journalnode
        

        
                dfs.ha.automatic-failover.enabled
                true
        

        
                dfs.client.failover.proxy.provider.kris
                org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
        

        
                dfs.ha.fencing.methods
                
sshfence
shell(/bin/true)

        

        
                dfs.ha.fencing.ssh.private-key-files
                /home/hadoop/.ssh/id_rsa
        

        
                dfs.ha.fencing.ssh.connect-timeout
                30000
        

配置mapred-site.xml



        
                mapreduce.framework.name
                yarn
        

配置yarn-site.xml





        
        yarn.resourcemanager.ha.enabled
        true


        
        yarn.resourcemanager.cluster-id
        iamkris


        
        yarn.resourcemanager.ha.rm-ids
        rm1,rm2


        
        yarn.resourcemanager.hostname.rm1
        server1


        
        yarn.resourcemanager.hostname.rm2
        server2


        
        yarn.resourcemanager.zk-address
        server1:2181,server1:2182,server1:2183



        yarn.nodemanager.aux-services
        mapreduce_shuffle


以上配置就基本完成了。接下来配置server1到server2,server3的免密登录。以及server2到server1、server3的免密登录

免密登录

server1,2之间的免密登录是因为ssh fence需要到对方机器上执行脚本。它们到server3的免密登录是因为当我们用start-dfs.sh时,是通过ssh到机器上启动datanode的

#生成公钥和私钥
ssh-keygen
#拷贝公钥到其他机器
ssh-copy-id server1

启动journalnode

zookeeper刚刚我们已经启动了,现在分别在server1和server2上启动qjournalnode。

hadoop-daemon.sh start journalnode

#运行jps命令校验,server1,server2上是否有多了journalnode进程

格式化hdfs

在server1上执行命令

hdfs namenode -format
#格式化后会根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/home/hadoop/hadata/tmp,然后将/home/hadoop/hadata/tmp
拷贝到server2的/home/hadoop/hadata/tmp下。journalnode文件夹也需要拷贝
#也可以这样hdfs namenode -bootstrapStandby

格式化ZKFC(在server1上执行一次即可)

hdfs zkfc -formatZK

启动hdfs(在server1上执行)

start-dfs.sh

执行此命令,记得在slaves文件中配置server3。表示在server3上启动子节点

启动yarn

start-yarn.sh

验证

到此,hadoop-2.6.4配置完毕,可以用浏览器访问:

#active
http://server1:50070

#standby
http://server2:50070

验证hdfs ha

  1. 首先向hdfs上传一个文件
    hadoop fs -put /helloha.txt
  2. 然后再kill掉active的namenode
    kill -9
  3. 通过浏览器访问http://server2:50070
    这个时候server2上的namenode变成了active
  4. 再执行
    hadoop fs -ls /
    可以发现刚刚上传的文件依然存在
  5. 手动启动刚刚挂掉的namenode
    hadoop-daemon.sh start namenode
  6. 访问http://server1:50070
    server1变成了standby

验证yarn

  1. 访问server1:8088
    可以看见yarn的的主页
  2. 访问server2:8088
    自动跳转到server1:8088
  3. 把server1上的resourcemanager kill掉
    kill -9
  4. 访问server2:8088
    可以看见yarn的主页

关注公众号领取更多福利

你可能感兴趣的:(hdfs,ha)