一、Hadoop高可用原理
1.原理
Hadoop高可用(Hadoop High Availability),是保证业务连续性的有效解决方案,通常通过设置备用节点的方式实现。一般将执行业务的名称节点称为活动节点(Active),另一个名称节点作为备用的节点(Standby),当活动节点出现问题导致业务不能正常的执行时,备用节点此时就会监测到,并立即切换为活动状态,从而保证业务的正常运行而不会被中断。
2.NameNode高可用
NameNode是HDFS的核心,如果NameNode失效了,那么整个HDFS也就不能提供服务了,所以Hadoop提供了高可用的方案,即Hadoop HA;HDFS提供了两种高可用的方案:一种是基于QJM(Quorum Journal Manager),另一种是基于NFS的。这里使用QJM来解决NameNode的单点故障问题,解决的方案就是在HDFS集群中建立多个NameNode节点。
为了保证NameNode元数据的一致性和编辑日志的安全性,采用Zookeeper来存储编辑日志文件。
多个NameNode节点中只有一个是处于Active状态的,其余都是Standby状态,同一时间只能有一个处于Active状态的NameNode节点。
多个NameNode上存储的元数据是实时同步的,当Active的NameNode出现故障时,通过Zookeeper实时切换到Standby的NameNode上,并将状态改为Active。
HDFS HA架构中有两台NameNode节点,一台是处于活动状态(Active)为客户端提供服务,另外一台处于热备份状态(Standby)。
DataNode会将心跳信息和Block汇报信息同时发给两台NameNode,DataNode只接受Active NameNode发来的文件读写操作指令。为了使备用节点保持其状态与Active节点同步,两个节点都与一组称为“JournalNodes”(JN)的单独守护进程通信。当Active节点执行任何名称空间修改时,它会将修改记录持久地记录到大多数这些JN中。待机节点能够从JN读取编辑,并且不断观察它们对编辑日志的更改。当备用节点看到编辑时,它会将它们应用到自己的命名空间。如果发生故障转移,Standby将确保在将自身升级为Active状态之前已从JournalNodes读取所有编辑内容。这可确保在发生故障转移之前完全同步命名空间状态。
3.ResourceManager高可用
ResourceManager HA通过主动/备用架构实现 - 在任何时间点,其中一个RM处于活动状态,并且一个或多个RM处于待机模式,等待活动RM出现故障或者宕机时机。转换为活动的触发器来自管理员(通过CLI)或启用自动故障转移时的集成故障转移控制器。
RM可以选择嵌入基于Zookeeper的ActiveStandbyElector来决定哪个RM应该是Active。当Active关闭或无响应时,另一个RM自动被选为Active,然后接管。请注意,不需要像HDFS那样运行单独的ZKFC守护程序,因为嵌入在RM中的ActiveStandbyElector充当故障检测器和领导者选择器而不是单独的ZKFC守护程序。
当存在多个RM时,客户端和节点使用的配置(yarn-site.xml)应该列出所有RM。客户端,应用程序管理器ApplicationMaster(AM)和节点管理器NodeManager(NM)尝试以循环方式连接到RM,直到它们到达活动RM。如果活动停止,他们将恢复循环轮询,直到他们连接到新的RM。
二、集群规划
| 机器名 | IP地址 | 软件列表 | 运行进程 |
| hadoop01 | 192.168.128.128 | JDK Zookeeper Hadoop | Namenode Resourcemanager Quorumpeermain(Zookeeper) DFSZKFailoverController(zkfc) |
| hadoop02 | 192.168.128.129 | JDK Zookeeper Hadoop | Namenode Resourcemanager Quorumpeermain(Zookeeper) DFSZKFailoverController(zkfc) |
| hadoop03 | 192.168.128.130 | JDK Zookeeper Hadoop | Datanode Nodemanager Journalnode Quorumpeermain(Zookeeper) Jobhistroy |
| hadoop04 | 192.168.128.131 | JDK Hadoop | Datanode nodemanager journalnode |
| hadoop05 | 192.168.128.132 | JDK Hadoop | Datanode nodemanager journalnode |
三、准备工作
1.创建5台linux服务器
2.安装文件上传下载工具
安装上传下载工具: yum -y install lrzsz
(此处已提前安装过了)
从本地文件上传到服务器中: rz
上传到服务器后查询上传文件(默认上传到当前目录下)
从服务器下载到本地文件中: sz
下载到本地后查询文件(默认下载到下载目录下)
3.配置SSH免密登录
1)配置每台服务器的主机名
●查看当前主机的主机名: hostname
●修改当前主机的主机名: hostnamectl set-hostname 新主机名
2)配置每台服务器的本地解析hosts文件
●配置解析文件: vim /etc/hosts
3)配置SSH免密登录
●查询是否有hadoop用户: cat /etc/passwd
●创建Hadoop用户和密码: useradd hadoop passwd hadoop
●切换至hadoop用户: su hadoop
●生成SSH密匙: ssh-keygen -t rsa
●将id发送至其他机器中: ssh-copy-id -I hadoop01 同样的方式发送到其他机器中
●测试ssh连接
4.安装Java运行环境
1)下载Java安装包并上传到服务器中
●在hadoop家目录下创建文件夹apps: mkdir apps
●从本地上传Java安装包到服务器中: rz
●解压完成安装: tar -zxvf jdk-8u241-linux-x.tar.gz
2)配置Java环境
●查看jdk的版本: bin/java -version
●配置hadoop用户的环境变量(在家目录下): vi .bashrc
●使配置文件生效: source .bashrc
●创建软链接映射到/usr/local目录下(不使用sudo可以切换为root用户):
sudo ln -s app/jdk1.8.0_241 /usr/local/jdk
●查询是否创建成功: ll /usr/local/
3)使用远程传输到其他机器中,并配置环境变量:
scp -r /home/hadoop/app/jdk1.8.0_241 hadoop@hadoop02:~/apps/
5.安装Zookeeper
1)下载Zookeeper并上传到服务器中
●从本地上传zookeeper安装包到服务器中: rz
●解压安装版完成安装: tar -zvxf zookeeper-3.4.13.tar.gz
2)配置Zookeeper环境
●创建Zookeeper的软链接:
sudo ln -s /home/hadoop/app/zookeeper-3.4.13 /usr/local/zookeeper
●修改环境变量(在家目录下): vi .bashrc
●重新编译环境变量:source .bashrc
●修改软链接的用户和组(使用root用户):
chown -R hadoop:hadoop /usr/local/zookeeper
●进入zookeeper配置文件目录: cd /usr/local/zookeeper/conf
●拷贝样例配置文件并重命名为zoo.cfg,并进入编辑:
cp zoo_sample.cfg zoo.cfg vi zoo.cfg
●创建data、log目录,只有hadoop有权限(先回到上级目录):
cd .. mkdir data mkdir log
●在data目录下新建myid文件,并编写对应节点编号:
cd data echo 1 > myid
3)使用远程传输到其他机器中,并配置环境变量
●上传到其他两台机器中(hadoop02和hadoop03):
scp -r /home/hadoop/app/zookeeper-3.4.13 hadoop@hadoop02:~/apps/
●修改对应的myid (如在hadoop02中):echo 2 > myid
●Zookeeper的启动(3台机器都启动): zkServer.sh start
●查看Zookeeper的状态: zkServer.sh status
四、Hadoop集群安装
1.安装Hadoop
1)从本地上传Hadoop安装包到服务器中: rz
2)解压压缩包完成安装: tar -zvxf hadoop-2.7.4.tar.gz
2.配置Hadoop环境
1)配置使得hadoop能使用root权限
●修改用户使用root用户登录: su - root
●修改hadoop用户的权限: visudo
2)创建软链接,并修改链接属主:
创建: sudo ln -s /home/hadoop/app/hadoop-2.7.4 /usr/local/hadoop
修改: chown -R hadoop:hadoop /usr/local/hadoop
3)配置相关的环境变量
●在hadoop用户家目录编辑环境配置文件: vi .bashrc
●使配置文件生效: source .bashrc
3.配置HDFS
1)进入Hadoop配置文件路径中
● cd /usr/local/hadoop/etc/hadoop
2)修改hadoop-env.sh
● vim hadoop-env.sh
3)配置core-site.xml
● vim core-site.xml
4)配置hdfs-site.xml
● vim hdfs-site.xml
4.配置YARN
1)配置yarn-site.xml
● vim yarn-site.xml
2)配置mapred-site.xml
●vim mapred-site.xml
3)在/usr/local/hadoop下创建hdpdata文件夹
● cd /usr/local/hadoop mkdir hdpdata
4)修改slaves文件(配置文件目录下)
● vim slaves 配置数据节点的主机
5.将配置好的Hadoop远程传输到其他主机中
1) scp -r /home/hadoop/app/hadoop-2.7.4 hadoop@hadoop2:~/app/
2)配置其他主机的环境变量即可
五、Hadoop集群启动
Hadoop集群的启动需要严格的按照以下顺序进行启动
1.启动JournalNode(在hadoop03、hadoop04和hadoop05上执行)
● hadoop-daemon.sh start journalnode
2.格式化HDFS(在hadoop01上执行)
● hdfs namenode -format
●启动zookeeper: zkStart-all.sh
●格式化成功之后会在core-site.xml中的hadoop.tmp.dir指定的路径下生成dfs文件夹,将该文件夹拷贝到hadoop02的相同路径下
scp -r hdpdata hadoop@hadoop02:/usr/local/hadoop
3.执行格式化ZKFC操作(在hadoop01上执行)
● hdfs zkfc -formatZK
4.启动HDFS(在hadoop01上执行)
●start-dfs.sh start
5.启动YARN(在hadoop02上执行)
● start-yarn.sh
●在hadoop01中单独启动一个ResourceManager作为备份节点
● yarn-daemon.sh start resourcemanager
6.启动JobHistoryServer(在hadoop02上执行)
● mr-jobhistory-daemon.sh start historyserver
7.安装启动完成
●NameNode (active):http://192.168.128.128:50070
●NameNode (standby):http://192.168.128.129:50070
●ResourceManager HTTP访问地址
●ResourceManager :http://192.168.128.129:8088
●历史日志HTTP访问地址
●JobHistoryServer:http://192.168.128.129:19888
六、Hadoop集群验证
1.向HDFS中上传一个文件
2.手动关闭active的名称节点
● hadoop-daemon.sh stop namenode
3.验证YARN是否正常工作及ResourceManager HA高可用
● hadoop fs -mkdir /wordcount
● hadoop fs -mkdir /wordcount/input
● hadoop fs -mv /README.txt /wordcount/input
● hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /wordcount/input /wordcount/output
运行中:
运行成功:
七、集群搭建过程中遇到的问题
1.Zookeeper配置时,提示可能未运行
●解决:
1)关闭防火墙
2)禁用开机启动
2.所有启动Hadoop的步骤做完后,发现hadoop02中使用jps后的进程数不对
●解决:发现原因是启动HDFS等操作之前没有启动Zookeeper,在启动HDFS前启动Zookeeper后成功!
八、总结
通过这次Hadoop HA集群的搭建,我了解如何通过linux系统安装Java环境、通过linux系统完成从本地文件的上传和下载,了解了如何配置SSH的免密登录。学会了如何安装和配置Zookeeper和Hadoop。这些使得我对大数据有了更深一步的了解,也知道了Hadoop HA所带来的强大的高可用性体验,总的来说,通过这次的实现我的收益颇多!下载本文