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 进程号即可

相关推荐