官方配置原文:
http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
zookeeper搭建:
node02下:
配置zk环境变量:
ZK配置文件:
修改为:
然后存放各自的id 和 配置zk环境变量:
node03:
node04:
开启ZK服务:
node02:
node03:
node04:
hadoop-HA-搭建:
配置 hdfs-site.xml 文件:
后面追加的内容:
#dfs.nameservices 命名空间的逻辑名称#dfs.ha.namenodes.[nameservice ID] 所有NameNode标示名称 dfs.nameservices mycluster #dfs.namenode.rpc-address.[nameservice ID].[name node ID] 每个namenode监听的RPC地址 dfs.ha.namenodes.mycluster nn1,nn2 dfs.namenode.rpc-address.mycluster.nn1 node01:8020 #dfs.namenode.http-address.[nameservice ID].[name node ID] 每个namenode监听的http地址。 dfs.namenode.rpc-address.mycluster.nn2 node02:8020 dfs.namenode.http-address.mycluster.nn1 node01:50070 #journalnode配置信息 dfs.namenode.http-address.mycluster.nn2 node02:50070 #journalnode持久化数据目录 dfs.namenode.shared.edits.dir qjournal://node01:8485;node2:8485;node3:8485/mycluster #这里配置HDFS客户端连接到Active NameNode的一个java类 dfs.journalnode.edits.dir /var/sxt/hadoop/ha/jn dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
#dfs.ha.fencing.methods
配置active namenode出错时的处理类。当active namenode出错时,一般需要关闭该进程。处理方式可以是ssh也可以是shell
<property>
<name>dfs.ha.fencing.methodsname> <value>sshfencevalue> property> <property> <name>dfs.ha.fencing.ssh.private-key-filesname> <value>/root/.ssh/id_dsavalue> property>
#在namenode身边启动ZKFC 开启自动故障转移
<property> <name>dfs.ha.automatic-failover.enabledname> <value>truevalue> property>
配置 core-site.xml 文件:
#fs.defaultFS 客户端连接HDFS时,默认的路径前缀。如果前面配置了nameservice ID的值是mycluster,那么这里可以配置为授权信息的一部分
<property>
<name>fs.defaultFSname> <value>hdfs://myclustervalue> property>
#hadoop.tmp.dir
<property>
<name>hadoop.tmp.dirname> <value>/var/sxt/hadoop/havalue> property>
#ha.zookeeper.quorum 标记三台zookeeper地址
<property>
<name>ha.zookeeper.quorumname> <value>node02:2181,node03:2181,node04:2181value> property>
分发修改好的文件:
给node01 和 node02 做免秘钥:
node01 -> node01 的免秘钥
node01 -> node02 的免秘钥
node02 -> node02 的免秘钥
node02 -> node01 的免秘钥
由于之前完全分布式node01已经和自己还有node02 做过免秘钥现在只需要做
node02 -> node02 的免秘钥
node02 -> node01 的免秘钥
实现方式和
node01 -> node01 的免秘钥
node01 -> node02 的免秘钥 一样
node02 下:
node01 下:
必须优先启动 journalnode:
启动node01 node02 node03 的 journalnode
格式化namenode:
我这边出现了报错信息:显示无法构建journal 后面两台服务器地址写错了
启动namenode:
格式化ZKFC:
node04 下:
启动服务:
node01:
node02:
node03:
node04:
zoo
node01:50070
node02:50070
演示:
杀死node01:
杀死node02 的 ZKFC:
停止服务:
node01:stop-dfs.sh
node02:zkServer.sh stop
node03:zkServer.sh stop
node04:zkServer.sh stop
再次启动:
node02、node03、node04:
zkServer.sh start
node01:
hadoop-daemon.sh start namenode
node02:
hdfs namenode -bootstrapStandby
node01:
start-dfs.sh
手动启动historyserver。
启动命令:mr-jobhistory-daemon.sh start historyserver
关闭命令:mr-jobhistory-daemon.sh stop historyserver