Hadoop HA模式部署
本节点主要介绍安装Hadoop HA模式的主要步骤。本次实训使用三个节点完成集群的搭建,具体集群规划如下所示:
主机名 | master | slaves1 | slaves2 |
---|---|---|---|
HDFS | NameNode DataNode | NameNode DataNode | DataNode |
YARN | NodeManagerr | ResourceManager NodeManager | ResourceManager NodeManager |
在安装Hadoop HA模式,我们需要完成一些准备工作,包括网络配置、关闭防火墙、安装SSH和安装JDK环境、Zookeeper组件安装等。
一、网络配置
态分配的IP地址是临时的,它会在一定时间内释放该IP地址供其他机器使用,因此使用该方式获取的IP地址不是固定的,这样会导致集群不稳定。因此我们需要设置为静态IP,具体操作如下:
-
打开【/etc/sysconfig/network-scripts/ifcfg-ens33】文件。
vi /etc/sysconfig/network-scripts/ifcfg-ens33
-
该文件为网卡配置文件,对该文件做以下修改:
BOOTPROTO="static"
打开虚拟机【编辑】->【虚拟网络编辑器】,查看VMnet8网卡的子网IP地址。
点击【NAT设置】界面,查看网关IP地址。
再向ifcfg-ens33添加以下内容:
IPADDR=192.168.80.160 #前3个数必须与网关IP的前3个数必须一致,最后一个数则随机填入1-255的数字,组成新的IP地址,该IP必须是未被占用的。
GATEWAY=192.168.80.2 #输入VMnet8网关IP地址
DNS1=114.114.114.114
注意:此处每台机器节点配置不一样,大家先进行子网IP查询,再添加以上内容。
- 重启网络
systemctl restart network
- 网络测试,尝试连接百度地址,如果能正常连接成功,则表示网络配置完成。
ping www.baidu.com
二、关闭防火墙和SELinux
注意:这个步骤只是为了我们学习方便,在实际工作中绝对不可以关闭防火墙,只能在防火墙配置需要开放的端口即可。
-
查看当前防火墙状态
systemctl status firewalld.service
CentOS 7默认是开机启动防火墙。因此我们要关闭防火墙并停止开启自动启动防火墙设置。
-
关闭当前防火墙
systemctl stop firewalld.service
- 关闭防火墙的开机自启
systemctl disable firewalld
- 关闭后再查看防火墙状态。
systemctl status firewalld.service
如果防火墙状态变为Inactive(dead)状态,则表示防火墙关闭成功。
关闭完防火墙后,我们即可使用XShell工具连接。
-
Linux有一个安全模块:SELinux,用以限制用户和程序的相关权限,来确保系统的安全稳定。SELinux的配置同防火墙一样,非常复杂,课程中不多涉及,后续视情况可以出一章SELinux的配置课程。在当前,我们只需要关闭SELinux功能,避免导致后面的软件运行出现问题即可,
修改/etc/sysconfig/selinux文件
vim /etc/sysconfig/selinux
修改文件内容。
#将第7行的SELINUX=enforcing改为,保存退出后,重启虚拟机即可,千万要注意disabled单词不要写错,不然无法启动系统 SELINUX=disabled
三、安装JDK1.8环境
后续的大数据集群软件,多数是需要Java运行环境的,所以我们为每一台机器都配置JDK环境。
-
从Java官网中下载JDK1.8安装包。
-
上传JDK安装包到CentOS虚拟机。
创建一个目录/root/module,专门存放软件安装包
mkdir /root/module
使用XFTP工具上传JDK安装包到/root/module目录下。
-
解压JDK安装包。
cd /root/module tar -zxvf jdk-8u391-linux-x64.tar.gz -C /usr/local/
-
更改jdk目录名字
cd /usr/local/ mv jdk1.8.0_391 jdk1.8
-
配置环境变量,编辑/etc/profile文件,将JDK路径添加到PATH环境变量中。
vim /etc/profile
在/etc/profile文件末端添加以下内容
#JAVA HOME export JAVA_HOME=/usr/local/jdk1.8 export PATH=$PATH:$JAVA_HOME/bin
-
刷新环境变量
source /etc/profile
-
验证JDK是否生效
java -verison
出现Java版本号信息,则证明JDK安装完成。
四、复制CentOS镜像
安装集群化软件,首要条件就是要有多台Linux服务器可用。我们可以使用VMware提供的克隆功能,将我们的虚拟机额外克隆出3台来使用。
-
首先,关闭当前CentOS系统虚拟机
-
在VMWare工具中新建文件夹,命名为:
Hadoop集群
,将master机器拖到Hadoop集群文件夹中。 -
克隆master节点。鼠标右键点击【master】节点,选择【管理】->【克隆】进入虚拟机克隆管理界面。
克隆虚拟机当前状态。
选择【创建完整克隆】,虚拟机名称为slaves1,设置slaves1虚拟机的保存路径。点击【完成】。
-
重复以上操作,克隆出第二个节点:slaves2,并将slaves1与slaves2放到
Hadoop集群
文件夹中。
-
开启slaves1节点,修改slaves1节点的配置。
① 修改slaves1节点的主机名为slaves1
hostnamectl set-hostname slaves1
② 修改slaves1节点的固定ip为:192.168.80.161**(注意IP地址前3个数需跟VMnet8 IP网关地址前3个数必须一致)**
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改IPADDR的值
IPADDR=192.168.80.161
-
开启slaves2节点,修改slaves2节点的配置。
按照第5步步骤,将slaves2节点的主机名设置为slaves2,ip设置为:192.168.80.162**(注意IP地址前3个数需跟VMnet8 IP网关地址前3个数必须一致)**
-
添加主机名映射
修改3台节点的/etc/hosts文件。
vim /etc/hosts
在文件末端添加以下内容
192.168.80.160 master 192.168.80.161 slaves1 192.168.80.162 slaves2
五、 配置SSH免密登录
后续安装的集群,都需要远程登录以及远程执行命令,我们可以简单起见,配置三台Linux服务器之间的免密码互相SSH登录。
-
在每一台机器执行
ssh-keygen -t rsa
一直回车确认即可。
-
在每一台机器节点执行一下指令,
ssh-copy-id master ssh-copy-id slaves1 ssh-copy-id slaves2 #进行免密操作时会询问是否继续连接,输入“yes”后,再输入登录密码完成操作。
-
执行完毕后,使用SSH测试远程登录,如果三台机器能相互登录,且无须输入密码,即代表免密配置成功。
ssh master #远程登录master节点 exit #退出登录 ssh slaves1 #远程登录slaves1节点 exit #退出登录 ssh slaves2 #远程登录slaves2节点 exit #退出登录
六、配置Zookeeper集群
ZooKeeper 在 Hadoop HA 模式中发挥了关键的协调、状态管理和故障处理的作用,大大提高了 Hadoop 集群的可用性和可靠性。以下为Zookeeper配置步骤。
-
下载Zookeeper组件。
从Zookeeper官网中下载Zookeeper3.5.10版本的安装包,下载链接为:Index of /dist/zookeeper/zookeeper-3.5.10 (apache.org)
-
使用XFTP工具上传安装包到master节点的/root/module目录下
-
解压ZooKeeper到/usr/local目录下
cd /root/module tar -zxvf apache-zookeeper-3.5.10-bin.tar.gz -C /usr/local
-
切换到/usr/local/文件夹,将zookeeper-3.4.6重命名为zookeeper
cd /usr/local mv apache-zookeeper-3.5.10-bin zookeeper
-
配置Zookeeper环境变量
vim /etc/profile
在最下面添加以下内容
export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
-
重新加载环境变量,使环境变量生效。
source /etc/profile
-
将/usr/local/zookeeper/conf/zoo_sample.cfg重命名为zoo.cfg(ZooKeeper的配置文件)
cd /usr/local/zookeeper/conf/ mv zoo_sample.cfg zoo.cfg
-
修改Zookeeper的配置文件zoo.cfg
vi zoo.cfg
修改dataDir内容:
dataDir=/usr/local/zookeeper/zkdata
在文末添加以下内容:
server.1=master:2888:3888 server.2=slaves1:2888:3888 server.3=slaves2:2888:3888
-
新建/usr/local/zookeeper/zkdata,在该目录下新建文件myid
cd /usr/local/zookeeper/ mkdir zkdata cd zkdata echo 1 >> myid
-
复制zookeeper目录到slaves1与slaves2节点
scp -r /usr/local/zookeeper root@slaves1:/usr/local scp -r /usr/local/zookeeper root@slaves2:/usr/local
-
修改slaves1中的myid文件为
2
,slaves2中的myid的节点为3
#在slaves1节点中操作 cd /usr/local/zookeeper/zkdata/ echo 2 > myid #在slaves2节点中操作 cd /usr/local/zookeeper/zkdata/ echo 3 > myid
-
配置slaves1与slaves2的Zookeeper的环境变量,并使其生效。
#在slaves1与slaves2节点中操作 vim /etc/profile
在文件末端添加以下内容:
export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
重新加载环境变量,使环境变量生效
source /etc/profile
七、 Hadoop集群部署
-
下载Hadoop安装包。打开浏览器,在浏览器地址栏中输入以下地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/。
-
选择hadoop-3.1.3.tar.gz 版本下载hadoop安装包。
下载完毕后,使用XFTP工具将安装包上传到master节点的/root/module目录下。
-
解压hadoop安装包到/usr/local目录下
cd /root/module #解压Hadoop压缩包 tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local/ #更改hadoop目录名称 mv /usr/local/hadoop-3.1.3 /usr/local/hadoop
-
配置环境变量
vim /etc/profile
在/etc/profile文件末端添加Hadoop路径到环境变量中。
#HADOOP ENV export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
保存退出,刷新环境变量。
source /etc/profile
-
Hadoop的配置文件要修改的地方很多,请细心!!!!进入到/usr/local/hadoop/etc/hadoop文件夹中,配置文件都在这里
cd /usr/local/hadoop/etc/hadoop
① 修改core-site.xml文件
vim core-site.xml
在
<configuration>
标签之间添加fs.defaultFS属性,具体配置如下:<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <!--指定文件系统的名称--> <property> <name>fs.defaultFS</name> <value>hdfs://ggb</value> </property> <!--配置Hadoop运行产生的临时数据存储目录--> <property> <name>hadoop.tmp.dir</name> <value>file:///usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <!--指定自动故障转移的集群--> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slaves1:2181,slaves2:2181</value> </property> </configuration>
② 修改hdfs-site.xml文件
vim hdfs-site.xml
具体配置内容如下所示:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <!--配置HDFS块的副本数(全分布式默认副本为3,最大副本512)--> <property> <name>dfs.replication</name> <value>3</value> </property> <!--配置HDFS元数据的存储目录--> <property> <name>dfs.namenode.name.dir</name> <value>file:///usr/local/hadoop/tmp/dfs/name</value> </property> <!--配置HDFS真正的数据内容(数据块)的存储目录--> <property> <name>dfs.datanode.data.dir</name> <value>file:///usr/local/hadoop/tmp/dfs/data</value> </property> <!--配置虚拟服务名--> <property> <name>dfs.nameservices</name> <value>ggb</value> </property> <!--为虚拟服务指定两个NameNode(目前每个服务器最多两个NameNode)--> <property> <name>dfs.ha.namenodes.ggb</name> <value>nn1,nn2</value> </property> <!--配置NameNode(nn1)的RPC地址--> <property> <name>dfs.namenode.rpc-address.ggb.nn1</name> <value>master:9000</value> </property> <!--配置NameNode(nn2)的RPC地址--> <property> <name>dfs.namenode.rpc-address.ggb.nn2</name> <value>slaves1:9000</value> </property> <!--配置NameNode(nn1)的HTTP地址--> <property> <name>dfs.namenode.http-address.ggb.nn1</name> <value>master:9870</value> </property> <!--配置NameNode(nn2)的HTTP地址--> <property> <name>dfs.namenode.http-address.ggb.nn2</name> <value>slaves1:9870</value> </property> <!--配置JournalNode通信地址--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slaves1:8485;slaves2:8485/ggb</value> </property> <!--配置NameNode出现故障时,启用备用NameNode的代理--> <property> <name>dfs.client.failover.proxy.provider.ggb</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--配置自动故障转移--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!--配置防止脑裂的手段,shell脚本--> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> </configuration>
③ 修改mapred-site.xml文件
vim mapred-site.xml
具体配置内容如下:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <!-- 指定MapReduce程序运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> </configuration>
④ 修改yarn-site.xml文件
vim yarn-site.xml
具体配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <configuration> <!-- 开启RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</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>slaves1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slaves2</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>master:2181,slaves1:2181,slaves2:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
⑤ 修改workers文件
vim workers
在workers文件添加以下内容
master slaves1 slaves2
⑥ 修改hadoop-env.sh
vim hadoop-env.sh
在文件开头添加以下内容
export JAVA_HOME=/usr/local/jdk1.8 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root export YARN_PROXYSERVER_USER=root
-
将配置好的hadoop目录复制到slaves1,slaves2节点下。
scp -r /usr/local/hadoop root@slaves1:/usr/local/ scp -r /usr/local/hadoop root@slaves2:/usr/local/
-
配置slaves1、slaves2节点的hadoop环境变量。
分别在slaves1与slaves2节点运行以下指令:
vim /etc/profile
在文件末端添加以下内容:
#HADOOP ENV export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
保存退出,并重新加载环境变量
source /etc/profile
-
启动Zookeeper集群
分别在master、slaves1、slaves2节点运行以下指令
zkServer.sh start
-
启动ournal Node集群
分别在master、slaves1、slaves2节点运行以下指令
hdfs --daemon start journalnode
-
格式化Zookeeper集群
在master节点运行以下命令:
hdfs zkfc -formatZK
-
格式化NameNode
在master节点运行以下命令:
hdfs namenode -format
-
启动master节点的namenode进程
在master节点运行以下指令:
hdfs --daemon start namenode
-
同步 master节点元数据到 salves1上
在slaves1节点运行以下指令:
hdfs namenode -bootstrapStandby
-
启动slaves1节点上的namenode进程
在slaves1节点运行以下指令:
hdfs --daemon start namenode
-
启动集群中所有的DataNode
在master节点运行以下指令
start-dfs.sh
-
启动ZKFC进程
在master与slaves1节点运行以下指令
hdfs --daemon start zkfc
-
验证故障转移,在master节点运行以下指令:
hdfs --daemon stop namenode
-
启动Yarn集群,在master节点运行以下指令:
start-yarn.sh
-
在任意节点运行以下节点查看resourceManager的状态
yarn rmadmin -getServiceState rm1 #active yarn rmadmin -getServiceState rm1 #standby
fs namenode -format
```
-
启动master节点的namenode进程
在master节点运行以下指令:
hdfs --daemon start namenode
-
同步 master节点元数据到 salves1上
在slaves1节点运行以下指令:
hdfs namenode -bootstrapStandby
-
启动slaves1节点上的namenode进程
在slaves1节点运行以下指令:
hdfs --daemon start namenode
-
启动集群中所有的DataNode
在master节点运行以下指令
start-dfs.sh
-
启动ZKFC进程
在master与slaves1节点运行以下指令
hdfs --daemon start zkfc
-
验证故障转移,在master节点运行以下指令:
hdfs --daemon stop namenode
-
启动Yarn集群,在master节点运行以下指令:
start-yarn.sh
-
在任意节点运行以下节点查看resourceManager的状态
yarn rmadmin -getServiceState rm1 #active yarn rmadmin -getServiceState rm1 #standby
至此我们的Hadoop高可靠部署完成。