N.1 HighAvailable概述
1)所谓HA(high available),即高可用(7*24小时不中断服务)。 2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。 3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。 4)NameNode主要在以下两个方面影响HDFS集群 (1)NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启 (2)NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用 5)HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。 |
N.2 HDFS-HA工作机制
0)故障迁移 (1)如果”主节点-A”挂了,这时候它所注册的节点”master-00001″将被自动删除,ZooKeeper会自动感知节点的变化,然后再次发出选举,这时候”主节点-B”将在选举中获胜,替代”主节点-A”成为新的主节点。 |
1)前面学习了使用命令hdfs haadmin -failover手动进行故障转移,在该模式下,即使现役(Ative状态)NameNode已经失效,系统也不会自动从现役NameNode转移到待机NameNode,下面学习如何配置部署HA自动进行故障转移。自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。 HA的自动故障转移依赖于ZooKeeper的以下功能: 2)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。 3)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。 ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NamNode的主机运行了一个ZKFC进程,ZKFC负责: 4)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。 5)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。 6)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为active状态。 |
N.3 HDFS-HA集群配置
N.3.1 规划集群
节点1 | 节点2 | 节点3 |
NameNode(运行的) JournalNode (共享edit的进程) DataNode QuorumPeerMain(ZK进程) DFSZKFailoverController(ZK客户端) | NameNode(备份替换) JournalNode DataNode QuorumPeerMain DFSZKFailoverController | JournalNode DataNode QuorumPeerMain |
ResourceMnager(运行) NodeManager | ResourceMnager(备份替换) NodeManager | NodeManager |
N.3.2 HDFS-HA集群配置
1)起始先修改IP地址 (1)修改每台的克隆主机的ip(克隆比较方便),确保关闭防火墙: (2)命令vi /etc/sysconfig/network-scripts/ifcfg-ens33 还要添加DNS2=8.8.4.4 注意网卡名字不唯一。 (3)命令vi /etc/resolv.conf 添加 nameserver 8.8.4.4(这里配置的8.8.4.4相当于一个备份,没有等于号) (4)重启网卡:service network restart 2)以下完成linux中ip域名和主机名设置。 (1)vi /etc/hosts:ip1 主机名1(域名),ip2 主机2(域名)、ip3 主机3(域名) 一般情况。 (2)vi /etc/hostname:主机名和域名是最好的。设置自己的主机名1,除了这里是一个主机名,其它的配置都是些域名 。 3)安装hadoop (1)在/softWare目录下创建一个HA文件夹,mkdir HA (2)将hadoop-2.8.4安装在到/softWare/HA目录下,使用wincp上传,进行解压。 (3)以前Linux的hadoop的环境变量要修改,这里创建了HA目录 4)以下完成linux的hadoop和jdk环境变量 (1)jdk和Hadoop安装后配置以下文件 vi /etc/profile (尾行添加如下)。 export JAVA_HOME=jdk解压路径 。 export HADOOP_HOME=/softWare/HA/hadoop-2.8.4 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME\bin:$HADOOP_HOME\sbin (冒号表示分割路径,$表示引用) :wq source /etc/profile (2)运行javac和java、java -version 测试命令是否成功。 (3)测试命令Hadoop和Hadoop version。而JAVA是Java version,他们参数不一样。 5)SH无密码登录 (1)生成公钥和私钥命令:ssh-keygen -t rsa (2)然后敲(三个回车)、就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥) 将公钥拷贝到要免密登录的目标机器上,也就是配置秘钥库。在主机1下配置如下:这样主机1访问别的主机的时候,就不需要密码,同时主机也要给自己配置免密。(如果出错一般是vi /etc/hosts里面配置错了) ssh-copy-id 主机名1(域名)、ssh-copy-id 主机名2、ssh-copy-id 主机名3 [1] 注:在另外两台机器上分别执行,共执行9遍 [2] 远程访问命令:ssh 主机名(域名)。 [3] 在~/.ssh的目录下有一下文件: 1. known_hosts :记录ssh访问过计算机的公钥(public key) 2. id_rsa :生成的私钥 3. id_rsa.pub :生成的公钥 4. authorized_keys :存放授权过得无秘登录服务器公钥,每个节点都有记录,配置秘钥库的时候,才会有这个目录的出现。 6)zookeeper分布式安装部署 (1)集群规划 在bigdata111、bigdata112和bigdata113三个节点上部署Zookeeper。 (2)解压安装 [1] 解压zookeeper安装包到/softWare/目录下 [itstar@bigdata111 softWare]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /softWare/ [2] 在/softWare/zookeeper-3.4.10/这个目录下创建zkData(由于存放数据的目录) mkdir -p zkData [3] 重命名/softWare/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg 配置文件只识别zoo.cfg; mv zoo_sample.cfg zoo.cfg (3)配置环境变量 [root@bigdata111 softWare]$ vi /etc/profile export ZOOKEEPER_HOME=/softWare/zookeeper-3.4.10 export PATH=$PATH:$ZOOKEEPER_HOME/bin(也可以在原来的PATH后面拼接上去) :wq [root@bigdata111 softWare]$source /etc/profile (4)配置zoo.cfg文件修改 [1] 具体配置: dataDir=/softWare/zookeeper-3.4.10/zkData 在增加如下配置: #######################注释cluster########################## server.1=bigdata111:2888:3888 server.2=bigdata112:2888:3888 server.3=bigdata113:2888:3888 [2] 配置参数解读 Server.A=B:C:D。 A是一个数字,表示这个是第几号(myid文件)服务器; B是这个服务器的ip地址; C是这个服务器与集群中的Leader服务器交换信息的端口; D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader, 而这个端口就是用来执行选举时服务器相互通信的端口。 集群模式下配置一个文件myid,这个文件在dataDir=/softWare/zookeeper-3.4.10/zkData目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。 (5)集群操作 [1] 在/softWare/zookeeper-3.4.10/zkData目录下创建一个myid的文件 touch myid 添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码 [2] 编辑myid文件 vi myid 在文件中添加与server对应的编号:如 2 。 [3] 拷贝配置好的zookeeper到其他机器上 scp -r zookeeper-3.4.10/ root@bigdata112.itstar.com:/softWare/ scp -r zookeeper-3.4.10/ root@bigdata113.itstar.com:/softWare/ 并分别修改myid文件中内容为3、4自定义。 [4] 分别启动zookeeper [root@bigdata111 zookeeper-3.4.10]# bin/zkServer.sh start [root@bigdata112 zookeeper-3.4.10]# bin/zkServer.sh start [root@bigdata113 zookeeper-3.4.10]# bin/zkServer.sh start [5] 查看状态 [root@bigdata111 zookeeper-3.4.10]# bin/zkServer.sh status JMX enabled by default Using config: /softWare/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: follower [root@bigdata112 zookeeper-3.4.10]# bin/zkServer.sh status JMX enabled by default Using config: /softWare/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: leader [root@bigdata113 zookeeper-3.4.5]# bin/zkServer.sh status JMX enabled by default Using config: /softWare/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: follower 7)完成Hadoop中的环境变量配置和文件配置 (1)配每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/hadoop-env.sh文件,添加环境变量: export JAVA_HOME=/softWare/jdk1.8.0_144(注:是自己安装的路径) 在添加的时候,注意前面是不是有“#”号。有#号就要注释掉。 (2)配置每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/core-site.xml文件, 可以先配置好一个节点的hadoop环境到时候在考培到其它节点。 <configuration> <!-- 把两个NameNode)的地址组装成一个集群mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/softWare/HA/hadoop-2.8.4/data</value> </property> <!--注册zookeeper信息,没有添加这步将会手动--> <property> <name>ha.zookeeper.quorum</name> <value>域名1:2181,域名2:2181,域名3:2181</value> </property> <!--修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException--> <property> <name>ipc.client.connect.max.retries</name> <value>300</value> <description> Indicates the number of retries a client will make to establish a server connection. </description> </property> <property> <name>ipc.client.connect.retry.interval</name> <value>40000</value> <description> Indicates the number of milliseconds a client will wait for before retrying to establish a server connection. </description> </property> </configuration> (3)配置每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/hdfs-site.xml文件。 <configuration> <!-- 完全分布式集群名称,会ZK创建mycluster目录--> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 集群中NameNode节点都有哪些--> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>nn1域名:9000</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>nn2域名:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>nn1域名:50070</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>nn2域名:50070</value> </property> <!-- 指定NameNode元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://nn1域名:8485;nn2域名:8485;nn3域名:8485/mycluster</value> </property> <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔离机制时需要ssh无秘钥登录,私钥--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 声明journalnode服务器存储目录,特别注意目录被写错了--> <property> <name>dfs.journalnode.edits.dir</name> <value>/softWare/HA/hadoop-2.8.4/data/jn</value> </property> <!-- 关闭权限检查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式,value里是类名--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--增加自动切换,没有配置这个会手动切换--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration> (4)配每个节点vi /softWare/HA/hadoop-2.8.4/etc/hadoop/slaves文件。 这个文件是存放DataNode节点的域名。如下: 域名1 域名2 域名3 8)完成Windows的文件配置。 start-yarn.sh 命令进行启动,(注意在主节点上面启动该命令就可以,其它的从节点就会相应启动), 使用浏览器访问 ip.8088(这个端口访问rm的) 然后上传文件或目录的命令(注意linux和hdfs表示同一个文件下,hdfs也有自己的根目录): hadoop fs -命令 (后面跟的命令是linux的命令)。 在hdfs创建目录 hadoop fs -mkdir /test 上传文件hadoop fs -put file /test 如果要游览器下载文件到自己电脑, 就在自己的电脑上C:\Windows\System32\drivers\etc\hots 的文件里面尾行 虚拟机的添加ip 域名。 使用notepad软件打开,编辑保存。 同时也可以进行域名访问。 jps命令查看jvm进程,NodeManager(nm),ResourceManager 9)格式化和同步 确保先启动zookeeper集群 (1)在各个节点上,输入以下命令启动journalnode服务(守护进程)在xshell发送所有会话: sbin/hadoop-daemon.sh start journalnode (2)在[nn1]上,对其进行格式化(对其中的一个进行格式化,随便哪个格式化),并启动: bin/hdfs namenode -format (在主节点运行,如果下次格式化就要删除Hadoop下的data目录和logs,格式化会重新产生) sbin/hadoop-daemon.sh start namenode (3)在[nn2]上,同步nn1的元数据信息: bin/hdfs namenode -bootstrapStandby (4)启动[nn2]: sbin/hadoop-daemon.sh start namenode (5)自动切切换是同过fuser命令切换的,有些系统没有该命令,所以安装这个命令。 yum -y install psmisc 或使用yum search fuser (6)关闭所有HDFS服务: sbin/stop-dfs.sh(在主节点运行,反正涉及多个启动,就只需在主节点运行即可) (7)启动Zookeeper集群(使用xshell发送会话): bin/zkServer.sh start(如果前面启动了就不要启动) (8)初始化HA在Zookeeper中状态(选择要做为active或standby的节点,进行初始化): [root@bigData111 hadoop-2.8.4]# bin/hdfs zkfc -formatZK 谁先启动zkfc就是 active。 (9)初始化后查看是否有产生了初始化的hadoop-ha目录,如果产生了,就说明成功了。 如错误了,就看它的提示错误了哪个文件哪一行。 [root@bigData111 hadoop]# zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper, hadoop-ha] (如果重新格式化就要删除hadoop-ha) (产生hadoop-ha的这个文件不要乱操作,不然自动节点切换会异常) (10)启动HDFS服务: 这里是全部启动,所以那个节点先启动DFSZKFailoverController,谁就是active状态。 [root@bigData111 hadoop]#start-dfs.sh (在主节点运行) [root@bigData111 hadoop]# jps 5121 Jps 4680 DataNode 4873 JournalNode 5051 DFSZKFailoverController 4573 NameNode 3999 QuorumPeerMain (11)测试把active的namenode进程给杀死。 (12)查看是不是自动切换 hdfs haadmin -getServiceState nn2 也可以通过网页访问查看。 (13)在恢复杀死的进程 hadoop-daemon.sh start namenode 10)注意可能报错事项 (1)以下原因都是因为内存不足所导致的,只需要将虚拟机的内存调大点即可,但有时候调大点也没有用,所以,可以通过core-site.xml文件,调价参数。 (2)注意一: 如果启动了,使用start-all.sh ,过了一会 发现namenode自动挂了 ,说明是JournalNode:8485启动了慢才导致的,所以过了一会等JournalNode完全启动后,在单独启动namenode,就好了。namenode启动的很快,但JournalNode却启动的很慢。 (3)注意二: 在格式化的时候,如果出现了java.net.ConnetException拒绝连接,很可能是JournalNode:8485启动的慢所导致的,所以过了一会,在格式化反而没有报错。 (4)命令 netstat -anp |grep 8485 是查看这个端口JournalNode有没有启动 |
N.4 YARN-HA集群配置
1)基于上面步骤在进行,第一步yarn配置 (1)具体配置vi /softWare/HA/hadoop-2.8.4/etc/hadoop/yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--启用resourcemanager ha--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--声明两台resourcemanager的地址,会ZK集群创建cluster-yarn-目录--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster-yarn-</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>域名1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>域名2</value> </property> <!--指定zookeeper集群的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>域名1:2181,域名2:2181,域名3:2181</value> </property> <!--启用自动恢复--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的状态信息存储在zookeeper集群--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration> (2)mapred-site.xml 里面没有这个文件 所以把这个后缀名删掉 .template <configuration> <!-- 指定mr运行在yarn上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> 2)第二步 (1)在选择active的节点上中执行: sbin/start-yarn.sh 其它节点就单独启动(yarn不用格式化) yarn-daemon.sh start resourcemanager (2)在选择standby的节点中执行: sbin/yarn-daemon.sh start resourcemanager (3)产看是否产生yarn-leader-election节点 [root@bigData111 ~]# zkCli.sh [zookeeper, yarn-leader-election, hadoop-ha, rmstore] (要删除yarn-leader-election也可以,启动会出现生成) (4)查看服务状态(注意:yarn自动切换需要稍等下大概5到10秒,就切换成功) 在http的页面是看不出来的,所以只能通过命令来查看。 bin/yarn rmadmin -getServiceState rm1 |