简单hdfs高可用架构图
在hadoop2.x中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
hadoop2.x官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里楼主使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode(我配了3个)。
这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态。hadoop2.4以前的版本中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,2.4以后解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调。yarn的HA配置楼主会给出配置文件,受环境影响,这里就不搭建yarn的高可用性了。
主要步骤
备6台Linux机器
安装JDK、配置主机名、修改IP地址、关闭防火墙
配置SSH免登陆
安装zookeeper集群
zookeeper、hadoop环境变量配置
核心配置文件修改
启动zookeeper集群
启动journalnode
格式化文件系统、格式化zk
启动hdfs、启动yarn
集群规划
主机名 | IP | 安装软件 | 进程 |
hadoop01 | 192.168.8.101 | jdk、hadoop | NameNode、DFSZKFailoverController(zkfc) |
hadoop02 | 192.168.8.102 | jdk、hadoop | NameNode、DFSZKFailoverController(zkfc) |
hadoop03 | 192.168.8.103 | jdk、hadoop | ResourceManager |
hadoop04 | 192.168.8.104 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop05 | 192.168.8.105 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop06 | 192.168.8.106 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
Linux环境
1.由于楼主机器硬件环境的限制,这里只准备了6台centos7的系统。
2.修改IP。如果跟楼主一样使用VM搭集群,请使用only-host模式。
vim /etc/sysconfig/network-scripts/ifcfg-ens3<!--这里不一定是ifcfg-ens3,取决于你的网卡信息-->
TYPE="Ethernet" BOOTPROTO="static" DEFROUTE="yes" PEERDNS="yes" PEERROUTES="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_PEERDNS="yes" IPV6_PEERROUTES="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="7f13c30b-0943-49e9-b25d-8aa8cab95e20" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.8.101"<!--每台机器按照分配的IP进行配置-->NETMASK="255.255.255.0" GATEWAY="192.168.8.1"
3.修改主机名和IP的映射关系
1 vim /etc/host2 3 192.168.8.101 hadoop014 192.168.8.102 hadoop025 192.168.8.103 hadoop036 192.168.8.104 hadoop047 192.168.8.105 hadoop058 192.168.8.106 hadoop06
4.关闭防火墙
1 systemctl stop firewalld.service //停止firewall2 systemctl disable firewalld.service //禁止firewall开机启动
5.修改主机名
1 hostnamectl set-hostname hadoop012 hostnamectl set-hostname hadoop023 hostnamectl set-hostname hadoop034 hostnamectl set-hostname hadoop045 hostnamectl set-hostname hadoop056 hostnamectl set-hostname hadoop06
6.ssh免登陆
生成公钥、私钥
ssh-keygen -t rsa //一直回车
将公钥发送到其他机器
ssh-coyp-id hadoop01 ssh-coyp-id hadoop02 ssh-coyp-id hadoop03 ssh-coyp-id hadoop04 ssh-coyp-id hadoop05 ssh-coyp-id hadoop06
7.安装JDK,配置环境变量
hadoop01,hadoop02,hadoop03
1 export JAVA_HOME=/usr/jdk1.7.0_602 export HADOOP_HOME=/home/hadoop/hadoop-2.7.33 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
hadoop04,hadoop05,hadoop06(包含zookeeper)
1 export JAVA_HOME=/usr/jdk1.7.0_602 export HADOOP_HOME=/home/hadoop/hadoop-2.7.33 export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.104 export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbinzookeeper集群安装
1.上传zk安装包
上传到/home/hadoop
2.解压
tar -zxvf zookeeper-3.4.10.tar.gz
3.配置(先在一台节点上配置)
在conf目录,更改zoo_sample.cfg文件为zoo.cfg
mv zoo_sample.cfg zoo.cfg
修改配置文件(zoo.cfg)
1 dataDir=/home/hadoop/zookeeper-3.4.10/data 2 server.1=hadoop04:2888:38883 server.2=hadoop05:2888:38884 server.3=hadoop06:2888:3888
在(dataDir=/home/hadoop/zookeeper-3.4.10/data)创建一个myid文件,里面内容是server.N中的N(server.2里面内容为2)
1 echo "5" > myid
4.将配置好的zk拷贝到其他节点
1 scp -r /home/hadoop/zookeeper-3.4.5/ hadoop05:/home/hadoop2 scp -r /home/hadoop/zookeeper-3.4.5/ hadoop06:/home/hadoop
注意:在其他节点上一定要修改myid的内容
在hadoop05应该将myid的内容改为2 (echo "6" > myid)
在hadoop06应该将myid的内容改为3 (echo "7" > myid)
5.启动集群
分别启动hadoop04,hadoop05,hadoop06上的zookeeper
1 zkServer.sh starthadoop2.7.3集群安装
1.解压
1 tar -zxvf hadoop-2.7.3.tar.gz
2.配置core-site.xml
1 <configuration> 2 <!-- 指定hdfs的nameservice为ns1 --> 3 <property> 4 <name>fs.defaultFS</name> 5 <value>hdfs://ns1</value> 6 </property> 7 <!-- 指定hadoop临时目录 --> 8 <property> 9 <name>hadoop.tmp.dir</name>10 <value>/home/hadoop/hadoop-2.7.3/tmp</value>11 </property>12 <!-- 指定zookeeper地址 -->13 <property>14 <name>ha.zookeeper.quorum</name>15 <value>hadoop04:2181,hadoop05:2181,hadoop06:2181</value>16 </property>17 </configuration>
3.配置hdf-site.xml
1 <configuration> 2 <!--指定hdfs的nameservice为ns1,必须和core-site.xml中的保持一致 --> 3 <property> 4 <name>dfs.nameservices</name> 5 <value>ns1</value> 6 </property> 7 <!-- ns1下面有两个NameNode,分别是nn1,nn2 --> 8 <property> 9 <name>dfs.ha.namenodes.ns1</name>10 <value>nn1,nn2</value>11 </property>12 <!-- nn1的RPC通信地址 -->13 <property>14 <name>dfs.namenode.rpc-address.ns1.nn1</name>15 <value>hadoop01:9000</value>16 </property>17 <!-- nn1的http通信地址 -->18 <property>19 <name>dfs.namenode.http-address.ns1.nn1</name>20 <value>hadoop01:50070</value>21 </property>22 <!-- nn2的RPC通信地址 -->23 <property>24 <name>dfs.namenode.rpc-address.ns1.nn2</name>25 <value>hadoop02:9000</value>26 </property>27 <!-- nn2的http通信地址 -->28 <property>29 <name>dfs.namenode.http-address.ns1.nn2</name>30 <value>hadoop02:50070</value>31 </property>32 <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->33 <property>34 <name>dfs.namenode.shared.edits.dir</name>35 <value>qjournal://hadoop04:8485;hadoop05:8485;hadoop06:8485/ns1</value>36 </property>37 <!-- 指定JournalNode在本地磁盘存放数据的位置 -->38 <property>39 <name>dfs.journalnode.edits.dir</name>40 <value>file:/home/hadoop/hadoop-2.7.3/journal</value>41 </property>42 <!-- 开启NameNode失败自动切换 -->43 <property>44 <name>dfs.ha.automatic-failover.enabled</name>45 <value>true</value>46 </property>47 <!-- 配置失败自动切换实现方式 -->48 <property>49 <name>dfs.client.failover.proxy.provider.ns1</name>50 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>51 </property>52 <!-- 配置隔离机制方法,多个机制用换行分割,每个机制占用一行-->53 <property>54 <name>dfs.ha.fencing.methods</name>55 <value>56 sshfence57 shell(/bin/true)58 </value>59 </property>60 <!-- 使用sshfence隔离机制时需要ssh免登陆 -->61 <property>62 <name>dfs.ha.fencing.ssh.private-key-files</name>63 <value>/home/hadoop/.ssh/id_rsa</value>64 </property>65 <!-- 配置sshfence隔离机制超时时间 -->66 <property>67 <name>dfs.ha.fencing.ssh.connect-timeout</name>68 <value>30000</value>69 </property>70 </configuration>
4.配置mapred-site.xml
1 <configuration>2 <!-- 指定mr框架为yarn方式 -->3 <property>4 <name>mapreduce.framework.name</name>5 <value>yarn</value>6 </property>7 </configuration>
5.配置yarn-site.xml
1 <configuration> 2 3 <!-- Site specific YARN configuration properties --> 4 <!-- 指定RM的地址 --> 5 <property> 6 <name>yarn.resourcemanager.hostname.rm1</name> 7 <value>hadoop03</value> 8 </property> 9 <property>10 <name>yarn.nodemanager.aux-services</name>11 <value>mapreduce_shuffle</value>12 </property>13 </configuration>
6.配置slaves
1 hadoop042 hadoop053 hadoop06
7.将配置好的hadoop拷贝到其他节点
scp -r /home/hadoop/hadoop-2.7.3 hadoop02:/home/hadoop scp -r /home/hadoop/hadoop-2.7.3 hadoop03:/home/hadoop scp -r /home/hadoop/hadoop-2.7.3 hadoop04:/home/hadoop scp -r /home/hadoop/hadoop-2.7.3 hadoop05:/home/hadoop scp -r /home/hadoop/hadoop-2.7.3 hadoop06:/home/hadoop启动
1.启动zookeeper集群(分别在hadoop04,hadoop05,hadoop06上启动zookeeper)
1 zkServer.sh start
2.查看zookeeper状态
1 zkServer.sh status
包含一个leader,二个follower
3.启动journalnode(分别在hadoop04,hadoop05,hadoop06上执行)
hadoop-daemon.sh start journalnode
运行jps命令检验,hadoop04,hadoop05,hadoop06上多了JournalNode进程
4.格式化HDFS
在hadoop01上执行命令:
1 hdfs namenode -format
检查是否成功看终端知否打印:
格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里楼主配置的是/home/hadoop/hadoop-2.7.3/tmp,然后将/home/hadoop/hadoop-2.7.3/tmp拷贝到ihadoop02的/home/hadoop/hadoop-2.7.3/下。
1 scp -r tmp/ hadoop02:/hadoop/hadoop-2.7.3/
5.格式化ZK(在hadoop01上执行即可)
1 hdfs zkfc -formatZK
效果如下(前面有点多截不下来,只截取了后面一部分):
6.启动HDFS(在hadoop01上执行)
1 start-dfs.sh
7.启动YARN(在hadoop03上执行)
1 start-yarn.sh验证
到此,hadoop-2.7.3集群全部配置完毕,下面我们来验证:
浏览器访问http://192.168.8.101:50070 NameNode 'hadoop01:9000' (active)
http://192.168.8.102:50070 NameNode 'hadoop02:9000' (standby)
浏览器访问resourceManager:http://192.168.8.103:8088
我们可以模拟NameNode(active)宕机,来验证HDFS的HA是否有效,NameNode(active)宕机后,NameNode(standby)会转为active状态,这里楼主不在演示。
结语
官网给出的文档还是比较详细的,楼主也是提取了官网的QJM解决方案来进行搭建。另外,yarn的HA搭建官网也给出了具体配置,有兴趣的同学可以试一试。