01 ssh免密安装
02 jdk安装
03 hadoop伪分布式安装
04 hadoop全分布式
完成了前面四步,现在做hadoop的高可用。其实和之前的lvs的高可用差不多的。如果我们有两个namenode节点,分别是node01和node02。假设node01是主节点,node02是从节点,当node01挂掉了以后,node02自动成为主节点。这里通过zookeeper的方式来实现,node01,node02都会注册到zookeeper当中,由zookeeper来实现高可用。文章有点长先收藏再阅读,开始。
准备
node01(192.168.146.101):namenode01 ,ZKFC,JNN(journalnode)
node02(192.168.146.102):namenode02,datanode,zookeeper,ZKFC,JNN
node03(192.168.146.103): datanode, zookeeper, JNN
node04(192.168.146.104): datanode,zookeeper,
hadoop配置修改
修改hadoop_env.sh 文件
在原来的基础上指定ZKFC 和journalnode 两个进程的角色,这里注意我们之前用到的从节点sencondarynamenode现在用不着了,可以remark起来。
cd /usr/hadoop-3.1.2/etc/hadoop
export JAVA_HOME=/usr/java/jdk-12.0.1
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
#export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
修改core-site.xml 文件
只用修改临时文件的目录即可,原来指向full现在建立一个新目录指向ha
vi core-site.xml
fs.defaultFS
hdfs://node01:9820
hadoop.tmp.dir
/var/hadoop/ha
修改hdfs-site.xml 文件
由于原先所有的datanode都需要和一个namenode做关联,现在做高可用需要让datanode和多个namenode做关联。因此,需要给namenode起一个logic name。同时需要配置两个namenode服务器(node01,node02)对应的rpc和httpaddress的信息。两个namenode进行同步的配置,这里需要指定journalnode服务器的地址。以及故障转移的代理类。
vi hdfs-site.xml
dfs.replication
3
#逻辑namenode 名字
dfs.nameservices
mycluster
#配置两个namenode服务器
dfs.ha.namenodes.mycluster
nn1,nn2
#配置rpc的调用
dfs.namenode.rpc-address.mycluster.nn1
node01:8020
dfs.namenode.rpc-address.mycluster.nn2
node02:8020
#配置http address
dfs.namenode.http-address.mycluster.nn1
node01:9870
dfs.namenode.http-address.mycluster.nn2
node02:9870
#配置journalnode节点
dfs.namenode.shared.edits.dir
qjournal://node01:8485;node02:8485;node03:8485/mycluster
#配置故障转移的调用
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
#故障隔离 当一个从节点即将要成为主节点的时候,会通知原来的主节点使之成为从节点。
dfs.ha.fencing.methods
sshfence
#故障隔离需要的私钥的地址
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
#配置journalnode的存储地址
dfs.journalnode.edits.dir
/var/hadoop/ha/journalnode
dfs.ha.automatic-failover.enabled
true
再回到core-site.xml文件的配置
原来配置的是一个固定的主节点的名字,现在需要使用逻辑的namenode的服务名称,也就是我们在上面hdfs-site.xml中定义的 mycluster 这个名字。以及对zookeeper集群的配置。
fs.defaultFS
hdfs://mycluster
ha.zookeeper.quorum
node02:2181,node03:2181,node04:2181
分发core-site.xml hdfs-site.xml 和 hadoop-env.sh 三个文件到其他三个服务器(node02,node03,node04)
scp core-site.xml hdfs-site.xml hadoop-env.sh node02:`pwd`
scp core-site.xml hdfs-site.xml hadoop-env.sh node03:`pwd`
scp core-site.xml hdfs-site.xml hadoop-env.sh node04:`pwd`
安装配置zookeeper
由于我们之前定义的zookeeper的安装是在node02,node03,node04三个服务器。所以copy下载zookeeper的安装包。对其进行解压。这里我把zk放到/usr 这个目录下面了。
tar xf zookeeper-3.4.6.tar.gz -C /usr/
配置环境变量
export ZOOKEEPER_HOME=/usr/zookeeper-3.4.6
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
再将这个配置分发到其余的两个服务器node03,node04
scp /etc/profile node03:/etc/profile
scp /etc/profile node04:/etc/profile
source /etc/profile
修改zoo.cfg,指定文件存放地址;并且告之参与zk集群的端口的具体信息
cd /usr/zookeeper-3.4.6/conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
dataDir=/var/zookeeper
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
分发zk到node02,node03
scp -r zookeeper-3.4.6/ node03:`pwd`
scp -r zookeeper-3.4.6/ node04:`pwd`
在三个节点创建zk的存储文件
mkdir /var/zookeeper
指定每个节点对应的服务器的名称根据zoo.cfg中的定义
server.1=node02
server.2=node03
server.3=node04
所以在node02中执行
echo 1 > /var/zookeeper/myid
所以在node03中执行
echo 2 > /var/zookeeper/myid
所以在node04中执行
echo 3 > /var/zookeeper/myid
启动zookeeper
分别在node02,node03,node04上运行zookeeper,并且查看启动后的状态。
zkServer.sh start
zkServer.sh status
可以看到node04作为leader,node02和node03都是follower。
启动journalnode 节点
我配置了三个journalnode节点,分别是node01,node02,node03.所以在这三个节点分别执行以下指令。
hdfs --daemon start journalnode
启动以后会在对应的目录下面生成存储edits持久化文件的目录。这个目录我配置到了/var/hadoop/ha,在前面的cord-site.xml 中有说明。
针对主节点,node01,node02 进行namenode的格式化。这里我们选择node01进行格式化,然后启动namenode做为主节点。再到node02上面去同步node01上面的数据,这样node01是active node02是standby,node02上面同步了node01的namenode的数据,一旦node01无法使用了,node02会变成active状态接替node01的工作。
node01操作
hdfs namenode -format
hdfs --daemon start namenode
node02操作
hdfs namenode -bootstrapStandby
这样node02就把node01的namenode数据同步过来了。
可以到 /var/hadoop/ha/dfs/name 下面的VERSION文件中检查两个节点的clusterID是否相同。
初始化zookeeper
zookeeper需要注册两个主从节点,node01,node02.注册以后当一个节点服务down机或者和zookeeper失去联系了,那么另外一个节点就会接替主节点的位置成为active状态。
ps:可以通过 zkCli.sh 命令打开zookeeper客户端查看zookeeper情况。
node01上运行
hdfs zkfc -formatZK
启动hadoop集群
到node01节点上启动集群
start-dfs.sh
运行完命令以后打开zookeeper客户端,查看
zkCli.sh
ls /hadoop-ha/mycluster
我们看到在myclusert这个集群下面多了两个节点,这两个节点就是zookeeper注册的主从节点,node01,node02。可以通过以下命令查看两个节点的状态。
get /hadoop-ha/mycluster/ActiveBreadCrumb
get /hadoop-ha/mycluster/ActiveStandbyElectorLock
测试高可用效果
去网站看看结果。在浏览器输入192.168.146.101:9870 和 192.168.146.102:9870
node01是active,node02是standby
然后把node01的namenode关掉。
到node01节点上运行
hdfs --daemon stop namenode
可以看到node01无法访问了,这个时候node02成为active状态,依旧可以提供访问。
到此hadoop高可用的配置和启动过程就完毕了。