hadoop2 ha概念特点 搭建手工切换ha的hdfs集群
0 ha简介:
high availibility: 高可靠,有两个namenode节点在运行,一个是active状态 一个是standby状态,此两个namenode要保持内部数据一致性
通过journalnode集群实现namenode内部数据一致性,active状态的namenode像journalnode集群写入数据,standby状态的namenode从journalnode集群读入数据
当active状态的namenode宕机下,可以自动或者手动方式将standby状态的namenode变成active状态
真实环境中如何确认不同机器担任何种角色?
答: namenode适合于大内存机器 datanode适合于大硬盘机器 journalnode对内存和硬盘要求不高无特殊需要
1 准备5个节点虚拟机,分配功能如下
namenode:h2master h2master2
datanode:h2sliver112 h2sliver113 h2sliver114
journalnode:h2master h2master2 h2sliver112
2 准备初始环境:
将5个节点机器的静态IP,机器别名,IP和别名映射关系(vi /etc/hosts 内写所有节点映射关系),防火墙关闭设置好
3 5台机器各自ssh互通
a) 在各自机器中生成各自机器ssh秘钥(ssh-keygen -t rsa),并cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys生成各自公钥
b) 分别在其余四台机器中通过命令ssh-copy-id -i h2master 将各自机器公钥拷贝到h2master中,
后在h2master中,通过scp /root/.ssh/authorized_keys 其余四个机器别名:/root/.ssh 拷贝回去
这样实现5台机器相互之间无密码下ssh连接
4 在h2master内安装jdk,配置环境变量,后拷贝到其余四个节点:
scp /etc/profile h2master2:/etc/profile scp -r /usr/local/jdk1.7 h2master2:/usr/local/ 或者写脚本执行: # vi mysh.sh #!/bin/sh for i in 112 113 do scp -rq /usr/local/hadoop2.5 h2sliver$i:/usr/local done
5 h2master配置hadoop配置文件,后拷贝到其余四个节点
配置文件写法和解释如下:
1.1 配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves) 1.1.1 hadoop-env.sh export JAVA_HOME=/usr/local/jdk1.7 1.1.2 core-site.xml <property> <name>fs.defaultFS</name> <value>hdfs://cluster1</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop2.5/tmp</value> </property> 1.1.3 hdfs-site.xml <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.nameservices</name> <value>cluster1</value> ------ ha对应的namenode节点定义 </property> <property> <name>dfs.ha.namenodes.cluster1</name> <value>h2master,h2master2</value> </property> <property> <name>dfs.namenode.rpc-address.cluster1.h2master</name> ------ ha对应的namenode节点端口地址 <value>h2master:9000</value> </property> <property> <name>dfs.namenode.http-address.cluster1.h2master</name> ------ ha对应的namenode节点端口地址 <value>h2master:50070</value> </property> <property> <name>dfs.namenode.rpc-address.cluster1.h2master2</name> ------ ha对应的namenode节点端口地址 <value>h2master2:9000</value> </property> <property> <name>dfs.namenode.http-address.cluster1.h2master2</name> ------ ha对应的namenode节点端口地址 <value>h2master2:50070</value> </property> <property> <name>dfs.ha.automatic-failover.enabled.cluster1</name> ------ ha 上取消自动恢复 <value>false</value> </property> <property> -- 节点数最少是3个并且建议使用奇数个 <name>dfs.namenode.shared.edits.dir</name> ------ 定义journalnode集群 /cluster1表示对cluster1对应的namenode集群进行数据共享 <value>qjournal://h2master:8485;h2master2:8485;h2sliver112:8485/cluster1</value> </property> <property> <name>dfs.journalnode.edits.dir</name> ------ 定义journalnode集群存储namenode集群的数据存放位置 <value>/usr/local/hadoop2.5/tmp/journal</value> </property> <property> <name>dfs.ha.fencing.methods</name> ------ 指定切换方式用ssh <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> ------ 指定ssh私钥文件路径 <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.client.failover.proxy.provider.cluster1</name> ------ 声明执行切换要使用的代理类 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> 1.1.6 slaves h2sliver112 h2sliver113 h2sliver114
拷贝代码写法如下,其余节点类推写法:
scp -r /usr/local/hadoop2.5 h2master2:/usr/local/
6 启动hadoop2 hdfs集群
a) 先启动journalnode集群: h2master h2master2 h2sliver112 sbin下上分别执行: hadoop-daemon.sh start journalnode 通过jps可以发现: [root@h2sliver112 sbin]# jps 5617 Jps 5571 JournalNode 启动成 b) 格式化namenode: b.1)在h2master格式化后启动: bin/hdfs namenode -format sbin/hadoop-daemon.sh start namenode [root@h2master sbin]# jps 13436 NameNode 13298 JournalNode 13503 Jps b.2) 在h2master2上格式化并启动: bin/hdfs namenode -bootstrapStandby 表示从另一个namenode节点上把数据读取过来 sbin/hadoop-daemon.sh start namenode 格式化日志可见,确实是从h2master节点上拷贝文件过来: 15/01/10 23:44:36 INFO namenode.TransferFsImage: Opening connection to http://h2master:50070/imagetransfer?getimage=1&txid=0&storageInfo=-57:1431856901:0:CID-71ea9740-d125-461b-9663-f98bd1a5023d 15/01/10 23:44:36 INFO namenode.TransferFsImage: Image Transfer timeout configured to 60000 milliseconds 15/01/10 23:44:37 INFO namenode.TransferFsImage: Transfer took 0.00s at 0.00 KB/s 15/01/10 23:44:37 INFO namenode.TransferFsImage: Downloaded file fsimage.ckpt_0000000000000000000 size 351 bytes. [root@h2master2 sbin]# jps 5843 Jps 5775 NameNode 5615 JournalNode b.3) 此时访问 http://h2master:50070/dfshealth.html http://h2master2:50070/dfshealth.html 会发现这两个节点都是standby状态, 在h2master上执行hadoop2.5/bin/hdfs haadmin -failover --forceactive h2master2 h2master haadmin -failover 命令是ha故障恢复命令,后面两个参数中,最后的参数表示让节点为active 第一个参数设置为standby 如果两个namenode节点都是standy状态 是不能执行hdfs操作的 执行也不会显示任何结果 d) 启动datanode 在datanode节点上分别执行 hadoop2.5/sbin/hadoop-daemons.sh start datanode
7 手动切换ha:
e.1) 上传数据到h2master中, [root@h2master bin]# hdfs dfs -put /etc/hosts / e.2) 手动杀死h2master [root@h2master bin]# jps 13436 NameNode 14108 Jps 13298 JournalNode [root@h2master bin]# kill -9 13436 [root@h2master bin]# jps 14120 Jps 13298 JournalNode [root@h2master bin]# hdfs haadmin -failover --forceactive h2master h2master2 ... Failover from h2master to h2master2 successful 此时在访问 http://h2master2:50070/dfshealth.html 会发现状态已经为active 再去h2mater2中查看 以前在h2master中上传的数据,会存在 ha保证了数据一致性 [root@h2master2 bin]# hdfs dfs -ls / -rw-r--r-- 3 root supergroup 323 2015-01-11 00:11 /hosts
8 关闭各节点写法:
关闭datanode: [root@h2master sbin]# hadoop-daemons.sh stop datanode h2sliver113: stopping datanode h2sliver112: stopping datanode h2sliver114: stopping datanode 两个节点关闭namenode: [root@h2master sbin]# hadoop-daemon.sh stop namenode stopping namenode [root@h2master2 sbin]# hadoop-daemon.sh stop namenode stopping namenode 注意: 关闭datanode 可以再任何节点关闭 并且使用命令hadoop-daemons.sh 是复数有s 关闭namenode 只能在namenode节点关闭 使用命令hadoop-daemons.sh 是单数没有s 关闭JournalNode: 直接 kill -9 进程号即可