HA搭建

HA搭建
早期的hadoop版本,NN是HDFS集群的单点故障点,每一个集群只有一个NN,如果这个机器或进程不可用,整个集群就无法使用。 为了解决这个问题,出现了一堆针对HDFS HA的解决方案(如:Linux HA, VMware FT, shared NAS+NFS, BookKeeper, QJM/Quorum Journal Manager, BackupNode等); 在HA具体实现方法不同的情况下,HA框架的流程是一致的, 不一致的就是如何存储和管理日志。在Active NN和Standby NN之间要有个共享的存储日志的地方,Active NN把EditLog写到这个共享的存储日志的地方,Standby NN去读取日志然后执行,这样Active和Standby NN内存中的HDFS元数据保持着同步。一旦发生主从切换Standby NN可以尽快接管Active NN的工作。

Secondary NameNode:它不是HA,它只是阶段性的合并edits和fsimage,以缩短集群启动的时间。当NN失效的时候,Secondary NN并无法立刻提供服务,Secondary NN甚至无法保证数据完整性:如果NN数据丢失的话,在上一次合并后的文件系统的改动会丢失。

在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。

hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode。

这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态。

2.hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop-2.4.1解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调。

在HA架构里面SecondaryNameNode这个冷备角色已经不存在了,为了保持standby NN时时的与主Active NN的元数据保持一致,他们之间交互通过一系列守护的轻量级进程JournalNode。

一:关闭防火墙
firewall-cmd --state
systemctl stop firewalld.service
systemctl disable firewalld.service
二:配置主机名 vim /etc/hostname
三:配置映射vim /etc/hosts
四:重启reboot
五:准备各种包
集群规划:
主机名 IP 安装的软件 运行的进程
weekend1 192.168.1.20 jdk、hadoop NameNode、DFSZKFailoverController(zkfc) 第二个是用来监听namenode是否升天了
weekend2 192.168.1.21 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
weekend3 192.168.1.22 jdk、hadoop ResourceManager 是yan的东西,用来分配任务的.yan和hdfs处于同一地位,yan的手下有nodemanager
weekend4 192.168.1.23 jdk、hadoop ResourceManager
weekend5 192.168.1.24 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain 第三个是用来放日志edits的,而fsimage放在namenode
weekend6 192.168.1.25 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain 上,第四个是zookeeper的
weekend7 192.168.1.26 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

六:步骤:

1.安装配置zooekeeper集群(在weekend5上)

1.1下载解压
tar -zxvf zookeeper-3.4.13.tar.gz
1.2 修改配置
cd /usr/local/zookeeper-3.4.13/conf/
cp zoo_sample.cfg 空 zoo.cfg
vim zoo.cfg
修改:dataDir=/usr/local/zookeeper-3.4.13/tmp
在最后添加:
server.1=weekend5:2888:3888
server.2=weekend6:2888:3888
server.3=weekend7:2888:3888
保存退出
然后创建一个tmp文件夹
mkdir /usr/local/zookeeper-3.4.13/tmp 写自己的hodoop路径
cd tmp后创建一个文件myid,里面写1,vim myid,保存退出
1.3 将配置好的zookeeper拷贝到其他节点(weekend6,weekend7)
scp -r /usr/local/zookeeper-3.4.13/ weekend6:/usr/local/
scp -r /usr/local/zookeeper-3.4.13/ weekend7:/usr/local/

注意:修改weekend6、weekend7对应/usr/local/zookeeper-3.4.13/tmp/myid内容
weekend6:
vim /usr/local/zookeeper-3.4.13/tmp/myid 2
weekend7:
vim /usr/local/zookeeper-3.4.13/tmp/myid 3

2.安装配置hadoop集群(在weekend1上操作)

2.1 解压
tar -zxvf hadoop-2.7.7.tar.gz
2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
#将hadoop添加到环境变量中
注意:环境变量每台都要,并且要生效 source /etc/profile

环境配置:
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_191
export HADOOP_HOME=/usr/local/hadoop-2.7.7
exportPATH= P A T H : PATH: JAVA_HOME/bin: H A D O O P H O M E / b i n : HADOOP_HOME/bin: HADOOP_HOME/sbin

2.2.1修改hadoo-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55

2.2.2修改core-site.xml

 <configuration>
                    <!-- 指定hdfs的nameservice为ns1 -->
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://ns1</value>  ns1是机架名,名字可随意
                    </property>
                    <!-- 指定hadoop临时目录 -->
                    <property>
                        <name>hadoop.tmp.dir</name>
                        <value>/usr/local/hadoop-2.7.7/tmp</value>  写自己的hodoop路径
                    </property>
                    
                    <!-- 指定zookeeper地址 -->
                    <property>
                        <name>ha.zookeeper.quorum</name>
                        <value>weekend5:2181,weekend6:2181,weekend7:2181</value>
                    </property>
                </configuration>

2.2.3修改hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>weekend1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>weekend1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>weekend2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>weekend2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://weekend5:8485;weekend6:8485;weekend7:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/usr/local/hadoop-2.7.7/journaldata</value> 写自己的hodoop路径
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
    <name>dfs.client.failover.proxy.provider.ns1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>
        sshfence
        shell(/bin/true)
    </value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
</property>
</configuration>

2.2.4修改mapred-site.xml

<configuration>
    <!-- 指定mr框架为yarn方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>    

2.2.5修改yarn-site.xml

<configuration>
        <!-- 开启RM高可用 -->
        <property>
           <name>yarn.resourcemanager.ha.enabled</name>
           <value>true</value>
        </property>
        <!-- 指定RM的cluster id -->
        <property>
           <name>yarn.resourcemanager.cluster-id</name>
           <value>yrc</value>
        </property>
        <!-- 指定RM的名字 -->
        <property>
           <name>yarn.resourcemanager.ha.rm-ids</name>
           <value>rm1,rm2</value>
        </property>
        <!-- 分别指定RM的地址 -->
        <property>
           <name>yarn.resourcemanager.hostname.rm1</name>
           <value>weekend3</value>
        </property>
        <property>
           <name>yarn.resourcemanager.hostname.rm2</name>
           <value>weekend4</value>
        </property>
        <!-- 指定zk集群地址 -->
        <property>
           <name>yarn.resourcemanager.zk-address</name>
           <value>weekend5:2181,weekend6:2181,weekend7:2181</value>
        </property>
        <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
        </property>
</configuration>

2.2.6修改slaves(slaves是指定子节点的位置,因为要在weekend1上启动HDFS、在weekend3启动yarn,所以weekend1上的slaves文件指定的是datanode的位置,weekend3上的slaves 文件指定的是nodemanager的位置)

          weekend5
          weekend6
          weekend7  

2.2.7配置免密码登陆

         #首先要配置weekend1到weekend2、weekend3、weekend4、weekend5、weekend6、weekend7的免密码登陆
            #在weekend1上生产一对钥匙
            ssh-keygen -t rsa
            #将公钥拷贝到其他节点,包括自己
            ssh-coyp-id weekend1
            ssh-coyp-id weekend2
            ssh-coyp-id weekend3
            ssh-coyp-id weekend4
            ssh-coyp-id weekend5
            ssh-coyp-id weekend6
            ssh-coyp-id weekend7
            #配置weekend3到weekend4、weekend5、weekend6、weekend7的免密码登陆
            #在weekend3上生产一对钥匙
            ssh-keygen -t rsa
            #将公钥拷贝到其他节点
            ssh-coyp-id weekend4
            ssh-coyp-id weekend5
            ssh-coyp-id weekend6
            ssh-coyp-id weekend7

#注意:weekend4也是一台rm,在这台机器上start-yarn.xml的时候,5 6 7 这三台nm启动时需要密码,所以配4到5 6 7 的免密登录也是需要的
#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置weekend2到weekend1的免登陆:

在weekend2上生产一对钥匙

            ssh-keygen -t rsa
            ssh-coyp-id -i weekend1

2.4将配置好的hadoop拷贝到其他节点

        scp -r /usr/local/hadoop-2.7.7/ weekend2:/usr/local/
        scp -r /usr/local/hadoop-2.7.7/ weekend3:/usr/local/
        scp -r /usr/local/hadoop-2.7.7/ weekend4:/usr/local/
        scp -r /usr/local/hadoop-2.7.7/ weekend5:/usr/local/
        scp -r /usr/local/hadoop-2.7.7/ weekend6:/usr/local/
        scp -r /usr/local/hadoop-2.7.7/ weekend7:/usr/local/

###注意:严格按照下面的步骤

2.5启动zookeeper集群(分别在weekend5、weekend6、weekend7上启动zk)

        cd /usr/local/zookeeper-2.7.7/bin/
        ./zkServer.sh start
        #查看状态:一个leader,两个follower
        ./zkServer.sh status

2.6启动journalnode(分别在在weekend5、weekend6、weekend7上执行)

        cd /usr/local/hadoop-2.7.7
        sbin/hadoop-daemon.sh start journalnode
        #运行jps命令检验,weekend5、weekend6、weekend7上多了JournalNode进程

2.7格式化HDFS

#在weekend1上执行命令:
        hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop-2.7.7/tmp,
然后将/usr/local/hadoop-2.7.7/tmp拷贝到 weekend2的/usr/local/hadoop-2.7.7下。
        scp -r tmp/ weekend2:/usr/local/hadoop-2.7.7
##也可以这样,建议hdfs namenode -bootstrapStandby

2.8格式化ZKFC(在weekend1上执行即可) zkfc是zookeeper故障控制器

       hdfs zkfc -formatZK

2.9启动HDFS(在weekend1上执行)

        sbin/start-dfs.sh

2.10启动YARN(#####注意#####:是在weekend3上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了 就要分别在不同的机器上启动,jps后发现weekend4上没有rm,所以4上面也要启动一下yarn)

        /usr/local/hadoop-2.7.3/sbin/start-yarn.sh

到此,hadoop-2.7.7配置完毕,可以统计浏览器访问:
http://192.168.0.20:50070
NameNode ‘weekend1:9000’ (active)
http://192.168.0.20:50070
NameNode ‘weekend2:9000’ (standby)

猜你喜欢

转载自blog.csdn.net/qq_43617838/article/details/85130280