hdfs的HA机制:NameNode服务器一台是ACTIVE,另一台是STANDBY。通过Qjournal(日志管理系统) 使用zkfc(基于zookeeper失败切换控制),管理集群的主节点的失败切换,防止集群单个主节点的宕机问题。

一、在数据节点slave1、slave2、slave3的hadoop的安装目录下新建app目录,在该app目录下新建zookeeper目录,用于放置zookeeper的安装目录,或者放置以后需要扩展的hive等目录:


二、在数据节点slave1、slave2、slave3上安装zookeeper

1、将下载好的zookeeper-3.4.5.tar.gz移动到/home/Hadoop/Hadoop-2.6.0/app/zookeeper下,将其解压后,进入到其安装目录下的conf目录下,将该目录下的zoo_sample.cfg复制一份为zoo.cfg:

mv zookeeper-3.4.5.tar.gz /home/Hadoop/Hadoop-2.6.0/app/zookeeper

cd /home/Hadoop/Hadoop-2.6.0/app/zookeeper

tar -zxvf zookeeper-3.4.5.tar.gz 

cd zookeeper-3.4.5/conf 

cp zoo_sample.cfg zoo.cfg 

2、配置zoo.cfg文件

 

3、在dataDir下新建myid文件,myid文件里就写一个数字,即zoo.cfg文件里所配置

server.X = slaveN:2888:3888中,节点N所对应的数字X。因此slave1、slave2、slave3中myid文件内容分别是数字1,2,3。

vim myid


注意:上述配置可以在一台数据节点机器上配置完成,然后通过scp命令远程传输到另外两台数据节点机器上,只需修改myid文件里的对应的数字即可。例如我在slave1上配置完成的,传输至slave2、slave3:

scp –r zookeeper/ hadoop@slave2:/home/Hadoop/Hadoop-2.6.0/app/

scp –r zookeeper/ hadoop@slave3:/home/Hadoop/Hadoop-2.6.0/app/

4、配置环境变量

vim ~/.bashrc

5、使环境变量生效

source ~/.bashrc

三、配置两台主节点(master、master1)机器免密登陆,由于原先的集群中,master那台主节点已经与三台数据节点实现免密登陆,接下来要实现新加入的master1主节点与三台数据节点的免密登陆。(注意,因为是在虚拟机中搭建,这里的master1是从master完整复制来的)

1、修改master1的ip(125.216.242.191)和hostname(master1)

sudo vim /etc/hostname


sudo vim /etc/hosts


2、将master1原有的~/.ssh目录删除,重新生成新的~/.ssh目录;查看~/.ssh权限,若为700,则不做任何操作,否则执行sudochmod 700 ~/.ssh修改权限;进入到.ssh目录,复制该目录下的id_rsa.pub为authorized_keys文件

ssh-keygen –t rsa –P ‘’

ls –al ~

cd ~/.ssh

cp id_rsa.pub authorized_keys

sudo chmod 600 authorized_keys

3、在master1中执行

scp id_rsa.pub hadoop@master:~/.ssh/key_from_master1

scp id_rsa.pub hadoop@slave1:~/.ssh/key_from_master1

scp id_rsa.pub hadoop@slave2:~/.ssh/key_from_master1

scp id_rsa.pub hadoop@slave3:~/.ssh/key_from_master1

4、在master、slave1、slave2、slave3中执行:

catkey_from_master1 >> authorized_keys

rm key_from_master1

注意:以上步骤实现了节点(master、slave1、slave2、slave3)单向免密登录节点(master1),但节点(master1)并不能免密登录节点(master、slave1、slave2、slave3)

5、在master中执行:scpid_rsa.pub hadoop@master:~/.ssh/key_from_master

在slave1执行:scpid_rsa.pub hadoop@slave1:~/.ssh/key_from_slave1

在slave2执行:scpid_rsa.pub hadoop@slave2:~/.ssh/key_from_slave2

在slave3执行:scpid_rsa.pub hadoop@slave3:~/.ssh/key_from_slave3

 

6、在master1中执行:

cat key_from_ master>>authorized_keys

cat key_from_ slave1>> authorized_keys

cat key_from_ slave2>>authorized_keys

cat key_from_ slave3>>authorized_keys

rm key_from_ master

rm key_from_ slave1

rm key_from_ slave2

rm key_from_ slave3

这样就实现了双向通信了。若master1还是不能免密连接,则在所有机器中执行ssh-add。

三、hadoop-2.6.0节点配置

1、进入hadoop的配置目录,修改相关配置文件

cd~/hadoop-2.6.0/etc/hadoop/

2、core-site.xml配置


3、hdfs-site.xml配置


4、mapred-site.xml


5、yarn-site.xml


6、slaves


注意:上述的配置只需在一台主节点机器上配置完成即可,然后使用scp命令将配置好的文件远程传输至其他机器上。例如我是在主节点(master)上配置的,将其远程传输至master1、slave1、slave2、slave3上,下面只以master1远程传输为例,其他依此类推。

scp core-site.xml hadoop@master1:/home/hadoop/hadoop-2.6.0/etc/hadoop/

scp hdfs-site.xmlhadoop@master1:/home/hadoop/hadoop-2.6.0/etc/hadoop/

scpmapred-site.xml hadoop@master1:/home/hadoop/hadoop-2.6.0/etc/hadoop/

scp yarn-site.xmlhadoop@master1:/home/hadoop/hadoop-2.6.0/etc/hadoop/

scp slaves hadoop@master1:/home/hadoop/hadoop-2.6.0/etc/hadoop/

四、集群启动过程

1、启动zookeeper集群,分别在slave1、slave2、slave3中输入zkServer.shstart开启服务,开启后使用jps查看是否有QuorumPeerMain进程,若有,则成功开启了,或者输入zkServer.sh status查看服务状态。


2、启动journalnode,分别在slave1、slave2、slave3中输入hadoop-daemon.shstart journalnode 同理,运行jps命令检验是否多了JournalNode进程


3、格式化namenode,由于我是将之前搭建的非HA集群转换成HA集群,所以不需要重新format namenode,如果是第一次新配置的集群,则在其中一台主节点上(master)执行hadoop namenode -format命令。(注意:该步骤由始至终只执行一次,执行多次可能造成集群启动不了)

4、格式化成功后,根据core-site.xml中的hadoop.tmp.dir配置生成的目录文件,这里我配置的是/home/hadoop/hdfs/tmp,然后将其远程传输至另一台主节点master1的/home/hadoop/hdfs下。

scp -r tmp/ hadoop@master1:/home/hadoop/hdfs/

或者也可以这样:在master1中执行hdfsnamenode –bootstrapStandby命令,做备份启动准备(建议)(注意:该步骤只需在第一次配置ha架构时使用,成功后,集群日后的启动可掠过该步骤)

4、只需在master一台机器上执行hdfszkfc –formatZK,格式化zkfc(注意:该步骤只需在第一次配置ha架构时使用,成功后,集群日后的启动可掠过该步骤)

5、在master和master1中都需要输入hadoop-daemon.shstart zkfc启动zkfc,同理,使用jps检验DFSZKFailoverController进程是否存在,存在,则成功启动zkfc了。


6、启动hdfs。在其中一台主节点(如:master)执行start-dfs.sh命令即可,在主节点输入jps命令检测Namenode是否启动,在数据节点输入jps命令,检测Datanode是否启动。


7、启动yarn,在其中一台主节点(如:master)执行start-yarn.sh命令即可,在主节点输入jps命令检测ResourceManager是否启动,在数据节点输入jps命令,检测NodeManager是否启动。

五、集群启动验证

如果是在master中启动的话,那么默认的浏览窗口会是这样: master1是Active状态,master是Standby状态。

1、打开浏览器,分别输入125.216.242.200:50070和125.216.242.191:50070,会查看到master是standby的,master1是active的。


2、在上述成功情况下,如果你去master1里面把这个namenode进程(输入kill 4250命令,其中4250是根据jps查询时匹配到的Namenode进程号)杀死的话,使用jps可以检测namenode进程不存在了,打开浏览器,会发现master自动切换为Active,master1变成无法连接。

3、此时,如果在master1节点中,输入hadoop-daemon.shstart namenode命令,启动死去的主节点namenode。打开浏览器,会发现:master1是standby的,master是active的。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐