本文搭建了一个由4个节点(node1、node2、node3、node4)构成的Hadoop-ha&zk集群.
HDFS 2.0 HA
主备NameNode
解决单点故障
主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
所有DataNode同时向两个NameNode汇报数据块信息
两种切换选择
手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
自动切换:基于Zookeeper实现
基于Zookeeper自动切换方案
ZooKeeper Failover Controller:监控NameNode健康状态,
并向Zookeeper注册NameNode
NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active
1、基础集群的搭建
2、集群网络配置
开启虚拟机,修改配置文件 输入如下命令
ls -l /etc/sysconfig/network-scripts/ifcfg-ens33
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=2fd4e3fc-509d-47b2-a833-e55f360a4661
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.4.110
NETMASK=255.255.255.0
GATEWAY=192.168.4.100
DNS1=8.8.8.8
DNS2=8.8.8.4
需要修改的地方有:
BOOTPROTO=static#dhcp改为static(修改)
ONBOOT=yes#开机启用本配置,一般在最后一行(修改)
IPADDR=192.168.4.110 #静态IP(增加)
GATEWAY=192.168.4.100 #默认网关,虚拟机安装的话,通常是2,也就是VMnet8的网关设置(增加)
NETMASK=255.255.255.0#子网掩码(增加)
#DNS1=8.8.8.8
重启网卡
service network restart
3、集群SSH免密登陆设置
3.1 创建hadoop用户
为三个节点分别创建相同的用户hadoop,并在以后的操作均在此用户下操作,操作如下:
#useradd -m hadoop
#passwd hadoop
为hadoop添加sudo权限,切换到root用户
#visudo
在该行root ALL=(ALL) ALL下添加hadoop ALL=(ALL) ALL保存后退出,并切换回hadoop用户
#su hadoop
注意事项:四个节点的用户名必须相同,不然以后会对后面ssh及hadoop集群搭建产生巨大影响
3.2 hosts文件设置
为了不直接使用IP,可以通过设置hosts文件达到ssh node1这样的的效果(四个节点设置相同)
$sudo vim /etc/hosts
在文件尾部添加如下行,保存后退出:
192.168.4.110 node1
192.168.4.120 node2
192.168.4.130 node3
192.168.4.140 node4
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
注意事项:不要在127.0.0.1后面添加主机名,如果加了master,会造成后面hadoop的一个很坑的问题,在slave节点应该解析出masterIP的时候解析出127.0.0.1,造成hadoop搭建完全正确,但是系统显示可用节点一直为0。
3.3 hostname修改
centos7默认的hostname是localhost,为了方便将每个节点hostname分别修改为node1、node2、node3、node4(以下以node1节点为例)。
$sudo hostnamectl set-hostname node1
重启terminal,然后查看:$hostname
3.3 ssh设置
设置node1节点和node2、node3、node4节点之间的双向ssh免密通信,下面以node1节点ssh免密登陆其它节点设置为例,进行ssh设置介绍(以下操作均在node1机器上操作):
[在node1节点设置完后,登录node2、node3、node4节点分别进行设置]
首先生成node1的rsa密钥:$ssh-keygen -t rsa
设置全部采用默认值进行回车
将生成的rsa追加写入授权文件:$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
给授权文件权限:$chmod 600 ~/.ssh/authorized_keys
进行本机ssh测试:$ssh node1正常免密登陆后所有的ssh第一次都需要密码,此后都不需要密码
将node1上的authorized_keys传到node2
sudo scp ~/.ssh/id_rsa.pub hadoop@node2:~/
登陆到node2操作:$ssh node2输入密码登陆
$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
修改authorized_keys权限:$chmod 600 ~/.ssh/authorized_keys
退出node2:$exit
进行免密ssh登陆测试:$ssh node2
4、java安装
目的:hadoop是基于Java的,所以要安装配置Java环境(三个节点均需要操作,以下以node1节点为例)
下载并安装:$sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
验证是否安装完成:$java -version
配置环境变量,修改~/.bashrc文件,添加行: export JAVA_HOME=/usr/lib/jvm/java-1.8.0
使环境变量生效:$source ~/.bashrc
5、Hadoop安装配置
目的:获得正确配置的完全分布式Hadoop集群(以下操作均在node1主机下操作)
安装前 四台节点都需要需要关闭防火墙和selinux
$sudo systemctl stop firewalld.service
$sudo systemctl disable firewalld.service
5.1 Hadoop安装
首先在node1节点进行hadoop安装配置,之后使用scp传到node2、node3、node4。
下载Hadoop二进制源码至node1,下载地址,并将其解压在~/ 主目录下
$tar -xvf ~/hadoop-2.5.2.tar -C ~/
$mv ~/hadoop-2.5.2/* ~/hadoop/
5.2 Hadoop的node节点配置
配置hadoop的配置文件core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml slaves(都在~/hadoop/etc/hadoop文件夹下)
$cd ~/hadoop/etc/hadoop
$vim core-site.xml其他文件相同,以下为配置文件内容:
1.core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
2.hdfs-site.xml
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>~/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
5.3 Hadoop的其他节点配置
此步骤的所有操作仍然是在node1节点上操作,以node1节点在node2节点上配置为例
复制hadoop文件至node2:$scp -r ~/hadoop hadoop@slave2:~/
5.4 Hadoop环境变量配置
配置环境变量,修改~/.bashrc文件,添加行(每个节点都需要此步操作,以node1节点为例):
#hadoop environment vars
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
使环境变量生效:$source ~/.bashrc
6.0 Zookeeper安装配置
配置环境变量,修改~/.bashrc文件,添加行(每个节点都需要此步操作,以node1节点为例):
zookeeper安装目录 /home/hadoop/zookeeper
修改conf/zoo.cfg
dataDir=/home/hadoop/zookeeper/zk
server.1=0.0.0.0:2888:3888 (注意:本机地址要配置成0.0.0.0,node2)
server.2=node3:2888:3888
server.3=node4:2888:3888
创建目录: mkdir /home/hadoop/zookeeper/zk
创建文件: echo 1 >> myid //数字根据节点规划 ,以node2为例
拷贝多台节点
Scp –r 拷贝 目录
修改myid
6.1 Zookeeper环境变量配置
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export ZK_HOME=/home/hadoop/zookeeper
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$ZK_HOME/bin:$ZK_HOME/sbin
拷贝多台节点
scp ~/.bashrc node2:~
scp ~/.bashrc node3:~
scp ~/.bashrc node4:~
使环境变量生效:$source ~/.bashrc
6.2 启动Zookeeper集群(node2、node3、node4)
同时启动三台机器 :zkServer.sh start
查看zookeeper服务:zkServer.sh status
从节点状态:ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: follower
主节点状态:ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: leader
6.3 启动journalnode服务(node1、node2、node3)
hadoop-daemon.sh start journalnode
成功启动后:执行jps命令查看服务
9565 JournalNode
8558 QuorumPeerMain
9599 Jps
注意:需要先启动 journalnode服务 然后再进行hadoop格式化
6.4 最后一步
配置文件:集群中要同步!!!
启动zookeeper集群
zkServer.sh start || zkServer.sh status
hadoop-daemon.sh start journalnode [在node1、node2、node3上执行]
第一台NN:
hdfs namenode –format [在node1、node2上执行]
hadoop-daemon.sh start namenode [在node1上执行]
另一台NN:
hdfs namenode –bootstrapStandby [在node上2执行]
hadoop-daemon.sh start namenode [在node2上执行]
stop-dfs.sh || start-dfs.sh [在node1上重启集群]
最后一步格式化zkfc
先在node2节点启动 zkCli.sh
然后在node1节点格式化zkfc: hdfs zkfc –formatZK
在node2节点查看集群详情: ls /
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, hadoop-ha]
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha/mycluster
[ActiveBreadCrumb, ActiveStandbyElectorLock]
[zk: localhost:2181(CONNECTED) 2] get /hadoop-ha/mycluster
cZxid = 0x400000004
ctime = Sat Jul 13 09:02:24 EDT 2019
mZxid = 0x400000004
mtime = Sat Jul 13 09:02:24 EDT 2019
pZxid = 0x40000003d
cversion = 30
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
[zk: localhost:2181(CONNECTED) 3]
注意 :第二次以后启动只需要
1.启动zk
2.start-dfs.sh
Web浏览器查看集群管理界面
node1:50070
node2:50070
问题纪录:
1.多次格式化集群会出现问题 ,解决办法是手工将四个节点的name、data文件下文件清空
/home/hadoop/hadoop/hdfs/ha/dfs/name/XXX
/home/hadoop/hadoop/hdfs/ha/dfs/data/XXX
然后在node1、node2、node3启动 hadoop-daemon.sh start journalnode
然后在node1、node2节点重新格式化namenode [hdfs namenode –format]
如果还有问题,删除以下目录缓存文件或者重启四台机器
/tmp/hadoop/dfs/journalnode/mycluster
如果以上办法都不行则根据报错信息收工修改
view /home/hadoop/hadoop/logs/hadoop-hadoop-namenode-node1.log
This node has namespaceId '1252632511 and clusterId 'CID-614ab438-d36e-4e37-8c20-a631ee8a1783' but the requesting node expected '276561900' and 'CID-8fd68be0-6c4d-4cde-a171-34397ce9cd83'
/tmp/hadoop/dfs/journalnode/mycluster/current/VERSION 中的 namespaceID、clusterID
#Sat Jul 13 08:22:37 EDT 2019
namespaceID=276561900
clusterID=CID-8fd68be0-6c4d-4cde-a171-34397ce9cd83
cTime=0
storageType=JOURNAL_NODE
layoutVersion=-57
~
~
2.配置zookeeper时出现问题 ,原因是zookeeper文件组权限及文件拥有者
sudo chmod -R 777 /home/hadoop/zookeeper [改变文件权限]
sudo chown hadoop:hadoop /home/hadoop/zookeeper [改变文件拥有者]
3.在格式化node1节点zkfc时出现连接拒绝问题
hdfs zkfc –formatZK
原因是需要先在node2、node3、node4节点启动zk服务 zkServer.sh start,然后在node2节点运行zkCli.sh,最后在node1节点格式化zkfc
4. 启动namenode 、datanode、或journalnode若有报错
则到该目录下查看相应的错误日志 /home/hadoop/hadoop/logs
zookeeper错误日志 在当前执行zk命令的目录下查看 zookeeper.out
5.ha环境配置好后,以后只需要启动zk和start-dfs.sh服务即可
在node2、node3、node4机器启动zk服务 [zkServer.sh start]
在node1 机器启动hdfs服务 start-dfs.sh