一、引言
(一)项目背景
随着大数据时代的来临,分布式文件系统因其极高的可靠性和性能以及可扩展性越来越受到人们的青睐。对于如今各社交网络、电子商务平台和音乐平台等娱乐平台融入人们的日常生活,而其日渐增长的注册用户以及庞大的数据量便需要依靠分布式文件系统来进行处理。作为大数据平台Hadoop平台的存储核心,HDFS逐渐成为了一个用来进行数据处理的标准,但整个集群只有一个Namenode,若这一个Namenode损坏,则整个Hadoop集群将不可以使用,此时Hadoop的高可用性显得尤为重要。在Hadoop HA中使用Standby Namenode作为Active Namenode的备用节点。在Active Namenode对于数据进行处理时,Standby Manage需要有与主Namenode相同的配置并进行同步备份。
(二)项目目的
随着数据量快速的增长,以HDFS为代表的分布式文件系统采用元数据和文件数据分离管理的模式被命名为元数据节点[1],例如HDFS中的NameNode。在只有一个Namenode的Hadoop集群中,如果这一个Namenode发生故障,则集群无法使用,只有通过重启集群才可以恢复。所以单Namenode的架构集群存在一些潜在问题[2],需要引入Hadoop HA。在同一集群中运行“主/备”两个Namenode进程就是典型的高可用集群。两个Namenode有着相同的配置,在任何时候,一个处于活动状态,一个处于待机状态,而着二者保持着相同的数据状态,可以在节点宕机或者时集群收到攻击时,将所有数据快速转移到另一个Namenode中。而最重要的就是始终保持只有一个Namenode处于活动中[3],否则两节点之间会发生冲突,导致数据丢失,在主/备切换时,由于切换不彻底,导致Slave和客户端误认为有两个活动的Namenode,使整个集群处于混乱之中。
二、Hadoop HA高可用平台的原理
(一)Hadoop HA概念
Hadoop1.x是密集型,在处理数据集方面有着重要作用,但它不是交互式数据分析的理想选择[4],并且会受到机器学习和内存集数据分析的约束,而Hadoop中的mapreduce同时处理资源调度和业务逻辑运算,耦合性较大。在Hadoop2.x中,增加了YARN,这样mapreduce可以只负责运算让YARN负责资源的调度[5]。同时它还引入了Hadoop高可用性功能,该功能为Hadoop框架引入了一个额外的NameNode(及Standby NameNode),该架构被配置为自动故障转移,如图2-1所示。
正在上传…重新上传取消
图2-1 Hadoop HA概念图
(二)HDFS高可用
Hadoop高可用分为HDFS高可用和YARN高可用。在一个HA集群之中会有两个Namenode,这两个Namenode一个处于Active的状态,另一个处于Standby的状态,外加一个Quorum Journal Manager日志管理器负责进行数据同步,处于活动之中的Namenode负责所有数据快的操作,而备份的Namenode则保持数据的同步性,这样在一个Namenode宕机之后,处于准备的Namenode可以在保证数据不丢失的情况下进行自动切换,如图2-2所示。
正在上传…重新上传取消
图2-2 HDFS HA概念图
(三)YARN高可用
Hadoop YARN是一种新的Hadoop资源管理器,可以给上层应用提供统一的资源调度和管理,它给集群在利用率、数据共享等方面带来了巨大的好处。YARN高可用大大减小了ResourceManager的资源消耗,并且让监测每一个子任务状态的程序分布式化,更加的安全。在新的YARN中,ApplicationMaster变成了一个可变更的部分,用户可以根据不同的编程模型自己写出APPMS,也因此更多类型的编程模型可以在Hadoop集群中运行,而YARN ResourceManager的状态信息可以直接写到ZooKeeper上,如图2-3所示。
正在上传…重新上传取消
图2-3 YARN HA概念图
(四)分布式协调服务ZooKeeper
ZooKeeper架构:ZooKeeper集群时一个基于主从复制的高可用集群,每一个服务器承担着Leader或者Follower的角色。一个ZooKeeper集群中同一时刻只可以有一个工作的Leader,它会发起并维护各个Follower之间所有的心跳;而一个ZooKeeper集群中可以有多个Follwer,它们都会响应Leader的心跳。Follower可以直接处理并返回客户端的请求,同时会将请求转发给Leader处理,如图2-4所示。
正在上传…重新上传取消
图2-4 ZooKeeper集群图
(五)HA集群规划
选取三台主机当做ZooKeeper集群,分别为master,slave1,slave2;按照高可用设计目标,需要有两个NameNode(一个用来工作一个作为备份)和两个ResourceManager(一个用来工作一个用来备份),3个JournalNode节点,如表2-5所示。
表2-5: HA集群规划图
IP地址 | 主机名 | 服务进程 |
192.168.149.135 | Master | NameNode(Active) ResourceManager(active) DataNode NodeManager JournalNode ZooKeeper |
192.168.149.136 | Slave1 | NameNode(Standby) ResourceManager(Standby) DataNode NodeManager JournalNode ZooKeeper |
192.168.149.137 | Slave2 | DataNode NodeManager JournalNode ZooKeeper |
三、安装部署
(一)前期准备
1. 虚拟机配置
3台虚拟机具有相同配置:内存2GB;处理器1一个;硬盘40GB;镜像CentOS-6.5-x86_64-bin-DVD1.iso;网络适配器NAT,如图3-1所示。
正在上传…重新上传取消
图3-1 虚拟机配置图
2. 服务安装包版本
JDK版本:jdk-8u171-linux-x64.tar.gz
Hadoop版本:hadoop-2.7.3.tar.gz
Hive版本:apache-hive-2.3.7-bin.tar.gz
ZooKeeper版本:zookeeper-3.4.5.tar.gz
Sqoop版本:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
HBase版本:hbase-1.2.6-bin.tar.gz
Spark版本:spark-2.4.7-bin-hadoop2.7.tgz
MySQL连接驱动版本:mysql-connector-java-5.1.27-bin.jar
3. 集群规划
3台虚拟机分别有IP地址为192.168.149.135,
192.168.149.136,192.168.137,如表3-1所示。
表3-1 集群规划表
IP地址 | 主机名 | 说明 |
192.168.149.135 | Master | 主节点、从节点 |
192.168.149.136 | Slave1 | 从节点 |
192.168.149.137 | Slave2 | 从节点 |
(二)基础服务部署
1. Java环境配置
3个节点上将jdk安装包解压到/usr/local/下一个为java的文件下,并在profile中添加环境变量,最后通过java -version来查看Java环境是否安装成功,如图3-2所示。
正在上传…重新上传取消
图3-2 Java环境配置图
2. MySQL的安装
在3个节点上配置好YUM源之后,通过 yum install -y mysql mysql-server mysql-devel的命令来安装MySQL并在profile文件中添加环境变量,最后通过service mysql start命令来启动服务,并通过mysql -uroot -p123456查看MySQL的安装情况,如图3-3所示。
正在上传…重新上传取消
图3-3 MySQL配置图
3. Hadoop的部署
(1)在主节点上将hadoop安装包解压到/home/目录下一个为hadoop-2.7.3的文件夹下,并在profile中添加环境变量。
(2)通过vi /home/hadoop-2.7.3/etc/hadoop/hadoop-env.sh进入到环境文件中修改Hadoop JDK路径,如图3-4所示。
正在上传…重新上传取消
图3-4 JDK路径图
(3)通过vi /home/hadoop-2.7.3/etc/hadoop/core-site.xml进入到配置文件中添加一下配置,其中指定了Namenode的URL地址以及主机端口和其他临时文件存放的地址,如图3-5所示。
正在上传…重新上传取消
图3-5 core-site.xml配置图
(4)通过vi /home/hadoop-2.7.3/etc/hadoop/hdfs-site.xml进入到配置文件中添加一下配置,指定了DataNode储存block副本的数量默认值为2个,如图3-6所示。
正在上传…重新上传取消
图3-6 hdfs-site.xml配置图
(5)通过vi /home/hadoop-2.7.3/etc/hadoop/yarn-site.xml进入到配置文件中添加一下配置,指出YARN的ResourceManager的节点,以及数据调度采用mapreduce_shuffle机制,如图3-7所示。
正在上传…重新上传取消
正在上传…重新上传取消
图3-7 yarn-site.xml配置图
(6)通过vi /home/hadoop-2.7.3/etc/hadoop/mapred-site.xml进入到配置文件中添加一下配置,指出mapreduce的框架为YARN如图3-8所示。
正在上传…重新上传取消
图3-8 mapred-site.xml配置图
(7)通过vi /home/hadoop-2.7.3/etc/hadoop/slaves进入到配置文件中添加一下配置,指明那些节点需要运行DataNode进程,如图3-9所示。
正在上传…重新上传取消
图3-9 slaves配置图
(8)通过scp命令将配置好的hadoop-2.7.3包发送给另外两个节点,如图3-10所示。
正在上传…重新上传取消正在上传…重新上传取消
图3-10 发送图
4. Hive的安装
(1)在主节点上将Hive安装包解压至/usr/local的目录下一个为hive的文件夹下,并在profile中添加环境变量。
(2)通过vi /usr/local/hive/conf/hive-env.sh进入到环境配置文件,修改Hadoop的目录,如图3-11所示。
正在上传…重新上传取消
图3-11 hive-env.sh配置图
(3)通过vi /usr/local/hive/conf/hive-site.xml进入到环境配置文件,配置MySQL数据库连接信息,如图3-12所示。
正在上传…重新上传取消
图3-12 hive-site.sh配置图
(4)将MySQL的连接驱动mysql-connector-java-5.1.40-bin.jar放入/usr/local/hive/lib中。
5. ZooKeeper的安装
(1)在主节点上将ZooKeeper安装包解压至/home/的目录下一个为zookeeper的文件夹下,并在profile中添加环境变量。
(2)在/home/zookeeper/目录下通过mkdir -p data/zkData文件。
(3)通过cd /home/zookeeper/conf/目录下重命名zoo_sample.cfg为zoo.cfg,进入到配置文件,指明保存ZooKeeper数据的路径,保存ZooKeeper日志的路径,监听客户端的端口号以及各节点的IP地址和server编号,如图3-13所示。
正在上传…重新上传取消
图3-13 zoo.cfg配置图
(4)在/home/zookeeper/data目录下创建myid文件,并在该文件中添加与zoo.cfg中server对应的编号,如图3-14所示。
正在上传…重新上传取消
图3-14 myid文件内容图
(5)通过scp -r /home/zookeeper slave1:/home和scp -r /home/zookeeper slave2:/home命令将zookeeper文件包发送到另外两节点之中,并分别修改myid为2和3。
6. HBase的安装
(1)在主节点上将HBase安装包解压至/home/的目录下一个为hbase的文件夹下,并在profile中添加环境变量。
(2)通过vi /home/hbase/conf/hbase-env.sh命令进入环境配置文件,添加Java环境变量,如图3-15所示。
正在上传…重新上传取消
图3-15 hbase-env.sh配置图
(3)通过vi /home/hbase/conf/regionservers命令进入配置文件,将其中的localhost修改为如图3-16所示。
正在上传…重新上传取消
图3-16 regionservers配置图
(4)通过vi /home/hbase/conf/hbase-site.xml命令进入配置文件,配置所有RegionServer的共享目录,设置HBase为线上模式和ZooKeeper集群的URL,如图3-17所示。
正在上传…重新上传取消
图3-17 hbase-site.xml配置图
(5)通过scp -r /home/hbase slave1:/home和scp -r /home/hbase slave2:/home命令将habse文件包发送到另外两节点之中。
7. Sqoop的安装
(1)在主节点上将sqoop安装包解压至/usr/local/的目录下一个为sqoop的文件夹下,并在profile中添加环境变量。
(2)将MySQL连接驱动mysql-connector-java-5.1.36.jar添加到/sqoop/lib下。
(3)通过vi /home/hbase/conf/sqoop-env.sh命令进入环境配置文件,添加配置信息,如图3-18所示。
正在上传…重新上传取消
图3-18 sqoop-env.sh配置图
8. Spark的安装
(1)在主节点上将spark安装包解压至/home/的目录下一个为spark的文件夹下,并在profile中添加环境变量。
(2)通过vi /home/spark/conf/spark-env.sh命令进入配置文件,添加Java环境变量,Hadoop路径,Hadoop配置目录以及驱动节点IP如图3-19所示。
正在上传…重新上传取消
图3-19 spark-env.sh配置图
(3)通过vi /home/spark/conf/slave2命令进入配置文件,将node1,node2添加进去。
(4)通过scp -r /home/spark slave1:/home和scp -r /home/spark slave2:/home命令将文件包发送给另外两节点。
(5)在主节点上将hive-site.xml文件通过cp /usr/local/hive/conf/hive-site.xml /home/spark/conf命令复制到/spark/conf/之中,并且将MySQL连接驱动放入/spark/jars/中,完成之后Spark便可以连接上Hive了。
1.查看profile文件
执行source /etc/profile命令,使得配置的环境生效,如图3-20所示。
正在上传…重新上传取消正在上传…重新上传取消
图3-20 环境配置文件图
2.启动集群
首先进行格式化 hdfs namenode -format,其次通过start-dfs.sh和start-yarn.sh启动HDFS和YARN,最后使用jps命令来查看服务是否启动成功,并查看HDFS Web页面和YARN Web页面,如图3-21,图3-22和图3-23所示。
正在上传…重新上传取消正在上传…重新上传取消
图3-21 jps查看命令图
正在上传…重新上传取消
图3-22 HDFS Web页面
正在上传…重新上传取消正在上传…重新上传取消
图3-23 YARN Web页面
3.启动Hive
(1)在确保HDFS和YARN已经被启动之后,启动Hive之前需运行schematool命令来进行初始化操作:schematool -dbType mysql -initSchema。
(2)在MySQL已经被启动的情况下输入hive命令来启动Hive,如图3-24所示。
正在上传…重新上传取消正在上传…重新上传取消
图3-24 Hive启动图
(3)在Hive中创建一张表,并写入数据,之后进行查看表来测试Hive,如图3-25和图3-26所示。
正在上传…重新上传取消
图3-25 建表图
正在上传…重新上传取消
图3-26 查看结果图
4.启动ZooKeeper
在3个节点上进入/home/zookeeper目录下执行bin/zkServer.sh start命令,再使用bin/zkServer.sh status命令来查看状态,一个节点应为leader,其他两个节点应为follower,如图3-27和图3-28所示。
正在上传…重新上传取消
图3-27 Master节点查看状态图
正在上传…重新上传取消
图3-28 slave1节点查看状态图
5.启动Hbase
在Hadoop已经启动成功的基础上在/home/hbase/的目录下输入start-hbase.sh命令来启动Hbase,输入hbase shell进入Hbase的命令模式,如图3-29所示。
正在上传…重新上传取消
图3-29 启动HBase图
6.启动Sqoop
输入sqoop-version,若看到版本信息则安装成功,如图3-30所示。
正在上传…重新上传取消
图3-30 Sqoop版本信息图
7.启动Spark
在主节点输入spark-sql,查看是否能成功读取Hive数据仓数据,如图3-31所示。
正在上传…重新上传取消
图3-31 Spark启动图
四、Hadoop 高可用平台的实现
(一)HDFS高可用的配置
1.集群命名和节点指定
在hdfs-site.xml文件中对于完全分布式集群名进行定义以及集群中NameNode节点的指定,如图4-1所示。
正在上传…重新上传取消正在上传…重新上传取消
图4-1 集群定义图
2.通信配置模块的实现
在指定节点为nn1和nn2之后,定义这两个的RPC通信地址和http通信地址以及元数据在JournalNode上存放的位置,如图4-2所示。
正在上传…重新上传取消
图4-2各节点通信地址配置图
3.故障自动转移模块的实现
配置失败自动切换实现的方式,隔离机制(即同一时刻只能有一台服务器对外响应),关闭权限检查和开机自启自动故障转移功能,如图4-3所示。
正在上传…重新上传取消
图4-3 自动切换配置图
4.本地文件存储目录以及ZooKeeper集群配置
在core-site.xml文件中指定处对外的集群地址,声明JournalNode服务本地文件系统的存储目录以及ZooKeeper集群配置,如图4-4所示。
正在上传…重新上传取消
图4-4 JournalNode声明图
(二)ZooKeeper中初始化高可用状态
1.清理所有环境设置:
在保证关闭所有的NameNode和DataNode的情况下,删除3节点上的data,logs文件夹,如图4-5所示。
正在上传…重新上传取消正在上传…重新上传取消
图4-5 环境文件清理图
2.初始化高可用在ZooKeeper中的状态
启动NameNode的时候进行节点注册,如图4-6所示。
正在上传…重新上传取消正在上传…重新上传取消
图4-6 初始化高可用图
(三)Hadoop高可用启动
1.主节点格式化HDFS
在master节点格式化HDFS,并启动NameNode,如图4-7所示。
正在上传…重新上传取消
图4-7 主节点格式化HDFS图
2.备用节点同步数据
在slave1节点同步master节点的数据信息,并启动NameNode,如图4-8所示。
正在上传…重新上传取消正在上传…重新上传取消
图4-8 备用节点同步数据图
3.查看web页面
在web页面上查看两节点服务启动情况,如图4-9和4-10所示。
正在上传…重新上传取消正在上传…重新上传取消
图4-9 master节点web页面图
正在上传…重新上传取消
图4-10 slave1节点web页面图
(四)YARN高可用的配置
1.集群命名和映射端口设定
确保高可用选举时对应了集群,这里设置为rm1和rm2,并指定主节点和备用节点的名称,完成映射和端口的设定,如图4-11所示。
正在上传…重新上传取消正在上传…重新上传取消
图4-11YARN集群配置图
2.RM状态配置
启用RM自动恢复以及配置状态储存以保留RM状态,如图4-12所示:
正在上传…重新上传取消正在上传…重新上传取消
图4-12 RM状态配置图
(五)YARN 高可用的实现
1. 在master节点单独启动的ResourceManager
如图4-13所示:
正在上传…重新上传取消正在上传…重新上传取消
图4-13 master启动ResourceManager图
2.在slave1节点单独启动ResourceManager
如图4-14所示:
正在上传…重新上传取消
图4-14 slave1节点启动ResourceManager图
3.测试YARN高可用并查看web页面
启动YARN高可用并测试8088端口,无论输入的哪一个节点,它都会自动调整到Active ResourceManager节点,有且仅有一个,如图4-15所示:
正在上传…重新上传取消
图4-15 YARN高可用页面显示图
五、Hadoop 高可用平台的测试
(一)NameNode性能测试
1.文件上传测试
在本地通过“hadoop fs -put abc.txt /test/abc”命令将本地文件abc导入到HDFS一个叫test的文件之中,并查看数据是否上传成功,如图5-1和图5-2所示。
正在上传…重新上传取消
图5-1 HDFS文件目录图
正在上传…重新上传取消正在上传…重新上传取消
图5-2 HDFS单个文件属性图