Hadoop HA集群的搭建(5个节点)
阅读原文时间:2021年04月20日阅读:1

特别说明,做大数据需要特别好的电脑配置,处理器至少i5吧,i5-8300H,显卡尽量GTX的,GTX1050,内存得有8G吧(我的是16G)

软件准备:jdk-1.8.0_191;hadoop-2.8.5;zookeeper-3.4.12,软件下载可以就不说了,直接去官网下载即可

系统准备:Centos7 64位

一、集群规划:

主机名               IP                                   安装软件                                运行进程

cluster-1           192.168.79.130               jdk,hadoop                           NameNode、DFSZKFailoverController(zkfc) 

cluster-2           192.168.79.133               jdk,hadoop                           NameNode、DFSZKFailoverController(zkfc)

cluster-3           192.168.79.131              jdk,hadoop                            ResourceManager

cluster-4           192.168.79.134              jdk,hadoop                            ResourceManager

cluster-5           192.168.79.135              jdk,hadoop,zookeeper          DataNode,NodeManager,JournalNode,OuorumPeerMain

cluster-6           192.168.79.136              jdk,hadoop,zookeeper          DataNode,NodeManager,JournalNode,OuorumPeerMain

cluster-7           192.168.79.137              jdk,hadoop,zookeeper          DataNode,NodeManager,JournalNode,OuorumPeerMain

cluster-8           192.168.79.138              jdk,hadoop,zookeeper          DataNode,NodeManager,JournalNode,OuorumPeerMain

cluster-9           192.168.79.139              jdk,hadoop,zookeeper          DataNode,NodeManager,JournalNode,OuorumPeerMain

二、前期准备

   1、修改Linux的主机名(每台虚拟机均要修改),命令:vi /etc/sysconfig/network

# Created by anaconda
NETWORKING=yes
HOSTNAME=cluster-1

2、将集群IP和主机名映射加入到每台虚拟机的/etc/hosts文件下,命令:vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.79.131    cluster-1
192.168.79.130    cluster-3
192.168.79.133    cluster-2
192.168.79.134  cluster-4
192.168.79.135  cluster-5
192.168.79.136  cluster-6
192.168.79.137  cluster-7
192.168.79.138  cluster-8
192.168.79.139  cluster-9

注意:是每台虚拟机,集群下的每台虚拟机均要写入ip和主机名映射

3、关闭防火墙

centos7关闭防火墙命令:systemctl stop firewalld(启动自然是start)

centos7查看防火墙状态命令:systemctl status firewalld

4、配置自身免密登录

命令:ssh-keygen -t rsa

后面的直接enter,不用输入内容,root目录下会生成一个.ssh的文件夹

cd .ssh下,会有id_rsa和id_rsa.pub的文件,需要新建一个文件(利用fileZilla新建文件也行),文件名为:authorized_keys

进入.ssh文件夹下,输入命令:cat id_isa.pub >> authorized_keys

就把秘钥配置成功了,就实现了自身免密登录,可以利用命令:cat authorized_keys查看里面内容

5、其它虚拟机的免密登录

需要在第一台虚拟机(这里主机名是:cluster-1)下免密登录其它虚拟机,使用命令:(以cluster-2为例)

免密配置的好处是:可以在第一台虚拟机下安装配置好软件,直接利用scp命令传到集群的其它虚拟机下,免得其它虚拟机又得安装配置,浪费时间。

ssh-copy-id cluster-2

6、windows下hosts文件的配置

找到C:\Windows\System32\drivers\etc目录下的hosts,以管理员身份打开它,添加集群IP和映射关系进去,如下所示:

192.168.79.131    cluster-1
192.168.79.130    cluster-3
192.168.79.133  cluster-2
192.168.79.134  cluster-4
192.168.79.135  cluster-5
192.168.79.136  cluster-6
192.168.79.137  cluster-7
192.168.79.138    cluster-8
192.168.79.139    cluster-9

三、软件安装(只在一台虚拟机进行操作,其它虚拟机利用scp命令进行复制即可)

1、JDK安装(简说)(在cluster-1上操作,其它进行复制即可)

解压,配置环境变量,这里我是解压到/usr/local/下

配置完后,利用命令:java -version查看是否安装成功!

在将jdk复制到其它8台虚拟机下,命令如下:(必须cd /usr/local/目录下操作)

[root@cluster-1 ~]# cd /usr/local/
[root@cluster-1 local]# scp -r jdk1.8.0_191/ cluster-2:/usr/local/

2、hadoop安装(在cluster-1上操作,其它进行复制即可)

将下载好的hadoop-2.8.5.tar.gz解压到/usr/local/目录下

文件配置:hadoop的配置文件全部在hadoop-2.8.5/etc/hadoop/目录下

(1)环境变量配置:

将hadoop添加到系统环境变量中,如下所示:

unset -f pathmunge
export JAVA_HOME=/usr/local/jdk1.8.0_191
export HADOOP_HOME=/usr/local/hadoop-2.8.5
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib
export PATH=$PATH:/usr/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

可以把这段copy到其它虚拟机下的环境变量下即可,别忘了这一步: source /etc/profile

(2)、修改hadoo-env.sh,配置JAVA环境,命令: vi hadoop-env.sh

找到JAVA_HOME,原来行如下:

export JAVA_HOME={JAVA_HOME}

修改后,如下所示:

export JAVA_HOME=/usr/local/jdk1.8.0_191

(3)修改core-site.xml文件,命令: vi core-site.xml

<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-2.8.5/tmp</value>
</property>                    
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>cluster-5:2181,cluster-6:2181,cluster-7:2181,cluster-8:2181,cluster-9:2181</value>
</property>
</configuration>

(3)、修改hdfs-site.xml文件,命令: vi 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>cluster-1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>cluster-1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>cluster-2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>cluster-2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://cluster-5:8485;cluster-6:8485;cluster-7:8485;cluster-8:8485;cluster-9:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop-2.8.5/journaldata</value>
</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>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 节点超时时间的配置 -->
<property>
<name>heartbeat.recheck.interval</name>
<value>2000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>1</value>
</property>
<!-- 冗余数据块自动删除时间的设置 -->
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>10000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
</configuration>

(4)修改mapred-site.xml文件(这里需要将mapred-site-defau.xml改为mapred-site.xml,

使用命令:mv mapred-site-default.xml mapred-site.xml)

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

(5)修改yarn-site.xml文件,命令: vi yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<!-- 开启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>cluster-3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>cluster-4</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>cluster-5:2181,cluster-6:2181,cluster-7:2181,cluster-8:2181,cluster-9:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

(6)修改slaves

(slaves是指定子节点的位置,因为要在cluster-1上启动HDFS、在cluster-3启动yarn,所以cluster-1上的slaves文件指定的是datanode的位置,cluster-3上的slaves文件指定的是nodemanager的位置)

cluster-5
cluster-6
cluster-7
cluster-8
cluster-9

(7)配置免密码登陆
     #首先要配置cluster-1到cluster-2、cluster-3、cluster-4、cluster-5、cluster-6、cluster-7、cluster-8、cluster-8的免密码登陆
                #在cluster-1上生产一对钥匙(在cluster-1上操作)
                ssh-keygen -t rsa
                #将公钥拷贝到其他节点,包括自己
                ssh-coyp-id cluster-1
                ssh-coyp-id cluster-2
                ssh-coyp-id cluster-3
                ssh-coyp-id cluster-4
                ssh-coyp-id cluster-5
                ssh-coyp-id cluster-6
                ssh-coyp-id cluster-7

                 ssh-coyp-id cluster-8

                 ssh-coyp-id cluster-9
                #配置cluster-3到cluster-4、cluster-5、cluster-6、cluster-7、cluster-8、cluster-9的免密码登陆
                #在cluster-3上生产一对钥匙(在cluster-3上操作)
                ssh-keygen -t rsa
                #将公钥拷贝到其他节点
                ssh-coyp-id cluster-4
                ssh-coyp-id cluster-5
                ssh-coyp-id cluster-6
                ssh-coyp-id cluster-7

                ssh-coyp-id cluster-8

                ssh-coyp-id cluster-9
                #注意:两个namenode之间要配置ssh免密码登陆,别忘了配置weekend02到weekend01的免登陆
                在cluster-2上生产一对钥匙(在cluster-2上操作)
                ssh-keygen -t rsa
                ssh-coyp-id -i cluster-1                
        
        (8)将配置好的hadoop拷贝到其他节点(在cluster-1上操作)     

cd /usr/local/
scp -r hadoop-2.8.5/ cluster-2:/usr/local/
scp -r hadoop-2.8.5/ cluster-3:/usr/local/
scp -r hadoop-2.8.5/ cluster-4:/usr/local/
scp -r hadoop-2.8.5/ cluster-5:/usr/local/
scp -r hadoop-2.8.5/ cluster-6:/usr/local/
scp -r hadoop-2.8.5/ cluster-7:/usr/local/
scp -r hadoop-2.8.5/ cluster-8:/usr/local/
scp -r hadoop-2.8.5/ cluster-9:/usr/local/

3、zookeeper的安装配置(在cluster-5上操作)

 (1)解压到/usr/local/目录下

(2)修改配置(在cluster-5上操作)
      cd /usr/local/zookeeper-3.4.12/conf/
         mv zoo_sample.cfg zoo.cfg
            vi zoo.cfg
            修改:dataDir=/usr/local/zookeeper-3.4.12/data
            在最后添加:           

server.1=cluster-5:2888:3888
server.2=cluster-6:2888:3888
server.3=cluster-7:2888:3888

server.4=cluster-8:2888:3888

server.5=cluster-9:2888:3888

            保存退出
            然后创建一个data文件夹
            mkdir /usr/local/zookeeper-3.4.12/data
            再创建一个空文件
            touch /usr/local/zookeeper-3.4.12/data/myid
            最后向该文件写入ID
            echo 1 > /usr/local/zookeeper-3.4.12/data/myid
     (3)复制软件(在cluster-5上操作)

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

cd /usr/local/
scp -r /usr/local/zookeeper-3.4.12/&nbsp;cluster-6:/usr/local/
scp -r /usr/local/zookeeper-3.4.12/&nbsp;cluster-7:/usr/local/
scp -r /usr/local/zookeeper-3.4.12/&nbsp;cluster-8:/usr/local/
scp -r /usr/local/zookeeper-3.4.12/&nbsp;cluster-9:/usr/local/

      注意:修改cluster-6、cluster-7、cluster-8、cluster-8对应/usr/local/zookeeper-3.4.12/data/myid内容

cluster-6:
    echo 2 > /usr/local/zookeeper-3.4.12/data/myid
cluster-7:
    echo 3 > /usr/local/zookeeper-3.4.12/data/myid
cluster-8:
    echo 4 > /usr/local/zookeeper-3.4.12/data/myid
cluster-9:
    echo 5 > /usr/local/zookeeper-3.4.12/data/myid

四、启动集群(严格按照此步骤进行)

   1、启动zookeeper集群

 (分别在cluster-5、cluster-6、cluster-7、cluster-8、cluster-9上启动zookeeper)            

cd /usr/local/zookeeper-3.4.12/bin/
./zkServer.sh start

           #查看状态:一个leader,四个follower
          命令:  ./zkServer.sh status

      
        2、启动journalnode

            (分别在cluster-5、cluster-6、cluster-7、cluster-8、cluster-9上执行)                       

cd /usr/local/hadoop-2.8.5/sbin/
./hadoop-daemon.sh start journalnode

 #运行jps命令检验,cluster-5、cluster-6、cluster-7、cluster-8、cluster-9上多了JournalNode进程 

      
        3、格式化HDFS(必须关闭所有集群的防火墙)
            #在cluster-1上执行命令:
            hdfs namenode -format
            #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop-2.8.5/tmp,然后将/usr/local/hadoop-2.8.5/tmp拷贝到cluster-2的/usr/local/hadoop-2.8.5/下。    

cd /usr/local/hadoop-2.8.5/
scp -r tmp/ cluster-2:/usr/local/hadoop-2.8.5/    

  ##也可以这样,建议hdfs namenode -bootstrapStandby
        
      4、格式化ZKFC(在cluster-1上执行即可)
            hdfs zkfc -formatZK
        
       5、启动HDFS(在cluster-1上执行)(注意:若cluster-5——cluster-9没有datanode进程,我在后面一章详述,往后看)
            sbin/start-dfs.sh

       6、启动YARN(注意:若cluster-4没有resourcemanager进程,我在第后面一章详述,往后看)

             (#####注意#####:是在cluster-3上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
            sbin/start-yarn.sh    

    
    到此,hadoop-2.8.5配置完毕,可以统计浏览器访问:
        http://cluster-1:50070
        NameNode 'cluster-1:9000' (active)


          http://cluster-2:50070
        NameNode 'cluster-2:9000'(standby)


    还可以查看节点数情况:


   验证yarn集群登录情况,可以用浏览器登录:http://cluster-4:8088/    其监控页面如下图所示:

 验证HDFS HA
        首先向hdfs上传一个文件
        hadoop fs -put /jdk-1.8.0_181 /
        hadoop fs -ls /

上传成功后看登录浏览器查看,如下所示,点击Utilities/Browse the file system目录下


        然后再kill掉active的NameNode
        kill -9
        通过浏览器访问:http://192.168.79.131:50070
        NameNode 'weekend02:9000' (active)
        这个时候cluster-2上的NameNode变成了active
        在执行命令:
        hadoop fs -ls /     
        刚才上传的文件依然存在!!!
        手动启动那个挂掉的NameNode
        sbin/hadoop-daemon.sh start namenode
        通过浏览器访问:http://192.168.79.131:50070
        NameNode 'cluster-1:9000' (standby)
     
测试集群工作状态的一些指令 :
bin/hdfs dfsadmin -report     查看hdfs的各节点状态信息
bin/hdfs haadmin -getServiceState nn1         获取一个namenode节点的HA状态

sbin/hadoop-daemon.sh start namenode  单独启动一个namenode进程
./hadoop-daemon.sh start zkfc   单独启动一个zkfc进程

五、问题说明

1、在cluster-1上启动hdfs时,查看cluster-5——cluster-9均没有datanode进程原因:

      (1)可以在cluster-5——cluster-9分别执行此命令

[root@cluster-7 sbin]# cd /usr/local/hadoop-2.8.5/sbin/
[root@cluster-7 sbin]# ./hadoop-daemon.sh start datanode

      (2)若利用(1)还是不行的话,可以在cluster-5——cluster-9删除/usr/local/hadoop-2.8.5/tmp/dfs/下的data文件利用命令:        

[root@cluster-7 hadoop-2.8.5]# cd tmp/dfs/
[root@cluster-7 dfs]# ll
总用量 0
drwx------. 3 root root 40 1月  25 13:07 data
[root@cluster-7 dfs]# rm -rf data/

      删除之后就可以利用(1)中方法进行了。

2、cluster-4的ResourceManger进程的启动

[root@cluster-4 hadoop-2.8.5]# cd sbin/
[root@cluster-4 sbin]# ./yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /usr/local/hadoop-2.8.5/logs/yarn-root-resourcemanager-cluster-4.out
[root@cluster-4 sbin]# 

   3、上传文件到根目录发现不行,试试防火墙是否关闭!

。。。。。。。。。。。。。。。遇到问题再说,先百度解决问题!