大数据平台Hadoop之HDFS HA的搭建
摘要:Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。
在Hadoop 2.0.0之前,NameNode在HDFS集群中存在单点故障的问题。一个集群只有一个NameNode,如果NameNode所在的主机宕机或者进程不可用,整个集群将不可用,直到NameNode从新启动。这两个方面影响了HDFS集群的总体可用性:(1)如果NameNode所在主机崩溃,集群将不可用,直到操作员重新启动NameNode。(2)NameNode机器上的计划维护事件(如软件或硬件升级)将导致集群停机。另外,仅一台NameNode存在内存受限的问题,影响系统扩展性。
HDFS HA通过在同一集群中运行两台NameNode来解决上述问题。其中一台NamNode处于活动状态,另一台处于备用状态。这允许在机器崩溃或计划维护的情况下快速故障切换到新的NameNode。
关键词:Hadoop ; HDFS HA
1.工作原理
在HDFS HA集群中,将两台独立的计算机配置为NameNodes,在任何时间点,其中一个NameNodes处于活动状态,另一个处于备用状态。处于活动状态的NameNode负责集群中的所有客户端操作,处于备用状态的NameNode的元数据需要与活动状态的NameNode的保持一致,以便在必要时提供快速故障转移。
为了使备用节点与活动节点保持同步,两个节点都与一组名为“JournalNodes”(JN)的独立守护程序进行通信。将处于活动状态的NameNode产生的记录日志文件edits交由JN集群来管理,而处于备用状态的NameNode将不断观察记录日志文件的变换,并同步自己的命名空间。
为了实现自动故障转移,需要为HDFS部署添加了两个新组件:ZooKeeper集群和ZKFailoverController进程(简称为ZKFC)。 ZooKeeper是一种高度可用的服务,用于维护少量协调数据,通知客户该数据的更改,以及监控客户端的故障。ZKFailoverController(ZKFC)是一个新的组件,它是一个ZooKeeper客户端,它还监视和管理NameNode的状态。运行NameNode的每台机器都运行一个ZKFC。
图1_1 HDFS HA 架构图
1.环境搭建
1.1使用VirtualBox安装CentOS 7
使用CentOS 7(64位)做为系统环境,安装4台CentOS 7 虚拟主机。通过修改/etc目录下hostname文件来修改主机名,4台机器主机名分别修改为s1,s2,s3,s4。
1.2配置静态IP地址
先将各台虚拟主机的网络改为桥接模式(桥接模式使得虚拟机能被分配得到网络中一个独立的IP,所有网络功能完全和网络中的真实机器一样),再为各台主机配置静态IP地址。第一步,通过修改/etc/sysconfig/network-scripts目录下ifcfg-enpS文件。将BOOTPROTO修改为static,ONBOOT修改为yes。并添加配置IPADDR(ip地址),GATAWAY(网关),NETMASK(子网掩码),DNS(域名解析服务器),具体参数视所在局域网决定。
第二步,重启网络服务,通过命令service network restart来实现。
第三步,测试网络是否通畅,通过命令ping www.baidu.com来实现。
1.3关闭防火墙
由于防火墙会禁止端口访问网络,影响集群中各个主机之间的通信,所以要关闭防火墙。通过命令sudo systemctl stop firewalld.service关闭防火墙。通过命令sudo systemctl disable firewalld.service来关闭防火墙开机启动。
1.4安装ssh实现主机间免密码访问
在各台主机安装ssh,通过命令yum install openssh-server -y来实现
在各台主机使用rsa算法在.ssh目录下生成公匙(id_rsa.pub)和私匙(id_rsa),通过命令ssh-keygen -t rsa -P ‘ ’ -f ~/.ssh/id_rsa来实现。
通过scp命令将s1主机的公匙发给s2主机,并将公匙追加到s2的authorized_keys,通过命令cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys实现。
s1现在可以免密码访问s2。以此类推,只需将A主机的公匙追加到B主机的authorized_keys,便可实现A主机免密码访问B主机。
1.5使用Xshell软件实现Windows主机访问Linux虚拟机
Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的,能够实现文件的上传、下载等功能。Xshell的使用:
(1)新建一个会话,在Xshell的Windows客户端上连接各台CentOS 7虚拟机。
(2)在各台虚拟机上,安装上传下载工具包rz及sz。通过yum install -y lrzsz来实现。
(3)在Windows客户端上传文件,上传命令是rz。从虚拟机下载文件,使用命令sz +文件名。
2.软件安装
2.1 jdk安装
在Java官网上下载Linux 64的jdk压缩包jdk-8u121-linux-x64.tar.gz,并通过Xshell软件将压缩包上传到各台CentOS虚拟机。
在各台虚拟机usr目录下创建soft目录,用来存放用户安装的软件。并修改usr目录的权限,使得该目录可以被所有人写入,通过命令chmod a+w /usr/soft实现。
(1)将jdk压缩包解压到soft目录下,通过命令tar -xzvf jdk-8u121-linux-x64.tar.gz -C /usr/soft命令来实现。
(2)配置Java环境变量。修改/etc目录下environment文件,添加JAVA_HOME=/usr/soft/jdk1.8.0_121(即jdk的解压路径),另起一行添加PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/soft/jdk1.8.0_121/bin:
(3)使环境变量配置立即生效,使用source /etc/environment命令。
(4)打印JAVA_HOME和PATH,查看环境变量配置是否生效。使用命令echo$JAVA_HOME和echo$PATH。若能够成功显示出配置的环境变量,则配置成功。
(5)测试Java是否安装成功。通过命令java version来查看。
2.2 Hadoop软件安装
(1)从Hadoop官网上下载Hadoop 2.7.3版,通过Xshell软件将压缩包上传到各台CentOS虚拟机。
(2)将压缩包解压到soft目录下,通过命令tar -xzvf hadoop-2.7.3.tar.gz -C /usr/soft来实现。
(3)配置Hadoop环境变量。修改/etc目录下environment文件,添加一行HADOOP_INSTALL=/usr/soft/hadoop-2.7.3(即Hadoop的解压路径)。并在PATH中添加/usr/soft/hadoop-2.7.3/sbin:/usr/soft/hadoop-2.7.3/bin:
(4)使环境变量配置立即生效,使用source /etc/environment命令。
(5)打印HADOOP_INSTALL和PATH,查看环境变量配置是否生效。使用命令echo $HADOOP_INSTALL和echo$PATH。若能够成功显示出配置的环境变量,则配置成功。
(6)测试Hadoop是否安装成功。通过命令hadoop version来查看。
2.3 zookeeper安装
(1)从zookeeper官网上下载zookeeper-3.4.9版,通过Xshell软件将压缩包上传到各台CentOS虚拟机。
(2)将压缩包解压到soft目录下,通过命令tar -xzvf zookeeper-3.4.9.tar.gz-C /usr/soft来实现。
(3)配置zookeeper环境变量。修改/etc目录下environment文件,添加一行ZOOKEEPER_HOME=/usr/soft/zookeeper-3.4.9(即zookeeper的解压路径)。并在PATH中添加/usr/soft/zookeeper-3.4.9/bin
(4)使环境变量配置立即生效,使用source /etc/environment命令。
(5)打印ZOOKEEPER_HOME和PATH,查看环境变量配置是否生效。使用命令echo $ZOOKEEPER_HOME和echo $PATH。若能够成功显示出配置的环境变量,则配置成功。
3.修改配置文件
HDFS配置文件在Hadoop解压目录下的/etc/hadoop目录下,需要修改hdfs-site.xml,core-site.xml,yarn-site.xml,mapred-site.xml,slaves这些配置文件。集群中每个主机的配置文件都相同,配置完一台主机的配置文件,需要将配置文件同步到其他主机。
3.1 配置hdfs-site.xml
#dfs.nameservices是自定义名称服务
<property>
<name>dfs.nameservices</name>
<value>sxt</value>
</property>
#dfs.ha.namenodes.sxt是用来确定集群NamdeNode ID
<property>
<name>dfs.ha.namenodes.sxt</name>
<value>nn1,nn2</value>
</property>
#配置两个NameNode的rpc地址
<property>
<name>dfs.namenode.rpc-address.sxt.nn1</name>
<value>s1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.sxt.nn2</name>
<value>s2:8020</value>
</property>
#配置两个NameNode的http地址
<property>
<name>dfs.namenode.http-address.sxt.nn1</name>
<value>s1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.sxt.nn2</name>
<value>s2:50070</value>
</property>
#配置JournalNodes地址
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://s2:8485;s3:8485;s4:8485/sxt</value>
</property>
#配置自动故障转移的代理
<property>
<name>dfs.client.failover.proxy.provider.sxt</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
#指定免密钥的方式为ssh
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
#指定私钥文件的地址
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
#edits文件在JournalNode集群存放的路径
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/journal/data</value>
</property>
#设置集群为自动故障转移
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
3.2配置core-site.xml
#配置默认的文件系统名称,是请求hdfs的入口
<property>
<name>fs.defaultFS</name>
<value>hdfs://sxt</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop</value>
</property>
#配置运行ZooKeeper服务的主机
<property>
<name>ha.zookeeper.quorum</name>
<value>s1:2181,s2:2181,s3:2181</value>
</property>
3.3配置slaves
slaves配置的是DataNode,将slaves编辑为s1 s2,将s1,s2主机作为DataNode。
3.4配置yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
#启用resourcemanager高可用
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>sxt2yarn</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>s3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>s4</value>
</property>
#指定zookeeper集群地址
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>s1:2181,s2:2181,s3:2181</value>
</property>
3.5配置mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3.6 zookeeper配置文件的修改
Zookeeper配置文件在zookeeper解压目录下的conf目录下,zookeeper配置文件操作如下:
(1)先从zoo_sample.cfg复制一份文件并明明为zoo.cfg,通过命令cp zoo_sample.cfg zoo.cfg来实现。
(2)修改zoo.cfg配置文件,如下:
#配置数据存储路径
dataDir=/opt/zookeeper
#列出构成ZooKeeper服务的服务器
server.1=s1:2888:3888
server.2=s2:2888:3888
server.3=s3:2888:3888
(3)创建/opt/zookeeper目录(即配置文件dataDir路径),在该目录下创建myid文件。myid文件包含服务器的编号。s1主机的myid里编辑为1,s2主机myid里编辑为2,s3主机myid里编辑为3
4.启动集群
(1)在s2,s3,s4主机上启动JournalNode,通过命令hadoop-daemon.sh start journalnode来实现。
(2)在s1主机上格式化NameNode,通过命令hdfs namenode -format来实现。并启动该NameNode,通过命令hadoop-daemon.sh start namenode来实现。
(3)同步另一台没有被格式化的NameNode,通过命令hadoop-daemon.sh start namenode -bootstrapStandby
(4)启动zookeeper集群,在s1,s2,s3主机上执行zkServer.sh start来实现。
(5)格式化zookeeper,在一台NameNode上执行hdfs zkfc -format命令。
(6)启动HDFS集群。通过命令start-all.sh来实现。如果ResourceManager结点没有启动,可以通过命令yarn-daemon.sh start resourcemanager命令启动。浏览NameNode的Web信息,通过访问地址 http:// s1:50070 /(s1是处于活动状态的NameNode)。浏览ResourceManager的Web界面,通过访问地址http://s3:8088/(s3是处于活动状态的ResourceManager)
(7)关闭集群。通过命令stop-all.sh先关闭HDFS集群,再通过命令zkServer.sh stop关闭zookeeper集群。
(8)再次启动集群时,先启动zookeeper集群,再启动HDFS集群。
5.总结
该HDFS HA集群是基于High Availability With QJM技术。共有两个NameNode,两个ResourceManager,都是一个处于活动状态,另一个处于备用状态。这样能有效解决单点故障的问题,当处于活动状态的NameNode(ResourceManager)不可用时,处于备用状态的NameNode(ResourceManager)能转化为活动状态,接替不可用结点的工作。下面是系统架构表:
| NN | DN | JN | ZK | ZKFC | RM |
S1 | 1 |
|
| 1 | 1 |
|
S2 | 1 |
| 1 | 1 | 1 |
|
S3 |
| 1 | 1 | 1 |
| 1 |
S4 |
| 1 | 1 |
|
| 1 |
表5_1系统架构表
(注:NN是NameNode的缩写,DN是DataNode的缩写,JN是JournalNode的缩写,ZK是zookeeper的缩写,RM是ResourceManager的缩写。)
在真实的生产环境中一台结点对应一台真实机器。但是在实验环境里,将多个结点放在一台机器上。