模拟环境:四台虚拟机node1、node2、node3、node4
node1 | node2 | node3 | node4 |
---|---|---|---|
NameNode-1 | NameNode-2 | ||
DataNode-1 | DataNode-2 | DataNode-3 | |
Zookeeper-1 | Zookeeper-2 | Zookeeper-3 | |
zkfc-1 | zkfc-2 | ||
JournalNode-1 | JournalNode-2 | JournalNode-3 |
jdk安装与环境变量配置
1. zookeeper集群搭建
https://blog.csdn.net/sinat_35400668/article/details/114989182
2. hadoop配置
一律在node1上操作,做完后scp到node2、node3、node4
上传hadoop压缩文件(hadoop-2.6.5.tar.gz),并上传至node1
- hadoop-env.sh配置JDK
- core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/var/theonly/hadoop/ha</value> </property> <!-- 指定每个zookeeper服务器的位置和客户端端口号 --> <property> <name>ha.zookeeper.quorum</name> <value>node2:2181,node3:2181,node4:2181</value> </property> </configuration>
- hdfs-site.xml
<configuration> <!-- 指定block默认副本个数 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 用于解析fs.defaultFS中hdfs://mycluster中的mycluster地址 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- mycluster下面由两个namenode服务支撑 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!--指定nn1的地址和端口号,发布的是一个hdfs://的服务--> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node2:8020</value> </property> <!--指定三台journal服务器的地址--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node2:8485;node3:8485;node4:8485/mycluster</value> </property> <!-- 指定客户端查找active的namenode的策略: 会给所有namenode发请求,以决定哪个是active的 --> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--在发生故障切换的时候,ssh到对方服务器,将namenode进程kill掉 kill -9 55767--> <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_dsa</value> </property> <!-- 指定journalnode在哪个目录存放edits log文件 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/theonly/hadoop/ha/jnn</value> </property> <!--启用自动故障切换--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
- slaves
node2 node3 node4
3. HA Hadoop启动
-
启动zookeeper集群
-
启动JournalNode
在node2,node3,node4分别执行命令
hadoop-daemon.sh start journalnode
-
格式化HDFS并启动NameNode
在任意一台NameNode上执行命令hdfs namenode -format hadoop-daemon.sh start namenode
-
同步元数据
在另一台NameNode上执行命令
hdfs namenode -bootstrapStandby
-
在所有NameNode节点上初始化zookeeper上的内容
hdfs zkfc -formatZK
-
启动hadoop集群
在任意节点
start-dfs.sh
4. 测试NameNode active
在任意一台NameNode上执行命令,访问node1和node2的8020端口,查看NameNode是active还是standy
# 停止namenode
hadoop-daemon.sh stop namenode
# 也可以停止zkfc,断开与zookeeper的联系
hadoop-daemon.sh stop zkfc
5. zookeeper信息查看
在zookeeper集群的任意节点开启客户端
zkCli.sh
# 查看临时文件
ls /hadoop-ha/mycluster
# 查看临时文件的内容
get /hadoop-ha/mycluster/ActiveStandbyElectorLock
6. 停止集群
stop-dfs.sh
# 停止zookeeper集群,node2、node3、node4上执行
zkServer.sh stop