准备工作
搭建zookeeper
1 安装zookeeper
2 配置zookeeper集群
server.2=slaver1:2888:3888
server.3=slaver2:2888:3888
配置HA
1 安装hadoop
<configuration>
<!--定义整个HA集群服务名-->
<property>
<name>dfs.nameservices</name>
<value>liaozx</value>
</property>
<!--定义整个HA集群中namenode的id名 我这边按照官方命名 nn1、nn2...-->
<property>
<name>dfs.ha.namenodes.liaozx</name>
<value>nn1,nn2</value>
</property>
<!--定义第一个namnode nn1的RPC访问主机及端口-->
<property>
<name>dfs.namenode.rpc-address.liaozx.nn1</name>
<value>master:8020</value>
</property>
<!--定义第二个namnode nn2的RPC访问主机及端口-->
<property>
<name>dfs.namenode.rpc-address.liaozx.nn2</name>
<value>slaver1:8020</value>
</property>
<!--定义第一个namnode nn1的http访问主机及端口-->
<property>
<name>dfs.namenode.http-address.liaozx.nn1</name>
<value>master:50070</value>
</property>
<!--定义第二个namnode nn2的http访问主机及端口-->
<property>
<name>dfs.namenode.http-address.liaozx.nn2</name>
<value>slaver1:50070</value>
</property>
<!--定义三个journal nodel所在的主机位置-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slaver1:8485;slaver2:8485;slaver3:8485/liaozx</value>
</property>
<!--定义failovercontroller的provider-->
<property>
<name>dfs.client.failover.proxy.provider.liaozx</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--设置远程登录通信协议 这里是ssh协议-->
<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_dsa</value>
</property>
<!--journal node工作目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/jn/data</value>
</property>
<!--设置failovercontroller是否自定切换 在这里我设置的是自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
注意:dfs.nameservice为整个集群服务名,我这里是我自己定义的。大家完全可以按照自己想法更改服务名
<configuration>
<!--指定默认hdfs集群服务名是哪个 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://liaozx</value>
</property>
<!--指定zookeeper服务所在主机 我这里zookeeper服务所在节点在master、slaver1、slaver2主机上-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slaver1:2181,slaver2:2181</value>
</property>
<!--指定hadoop的hdfs工作目录配置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop2.5.1</value>
</property>
</configuration>
<configuration>
<!--指定mapreduce计算框架是yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<configuration>
<!-- 指定ResourceManager节点的主机位置-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!--剩下两个是按照官网指定配置的 指定mapreduce框架节点配置-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
192.168.0.130 master
192.168.0.131 slaver1
192.168.0.132 slaver2
192.168.0.133 slaver3
192.168.0.134 slaver4
最后一点需要注意:集群中每台主机HA配置文件内容和hosts文件内容必须一致,另外zookeeper节点和zkfc节点上的zookeeepr/conf/zoo.cfg必须一致。
启动集群
配置好了过后不是不再是像hadoop1.x那样随便格式化就能启动的,在这个我把启动步骤列举出来,方便参阅。
1 将前面配置好的每台主机上的zookeeper服务启动起来 敲jps命令 有QuorumPeerMain这个进程就代表zookeeper成功启动
2 进入其中一个namenode节点主机,我这边namendnode主机是在master、slaver1主机上,我是在master主机上执行的操作。
3 记住,首先要启动journode节点格式化才能成功,在hadoop的sbin目录敲./hadoop-daemon.sh start journalnode命令启动journalnode,依次敲命令启动slaver1 、slaver2、slaver3节点journalnode服务。
4 对master主机上hdfs进行格式化
cd /usr/hadoop2.5.1/bin
./hdfs namenode -format
如果出现了success formated则证明格式化成功
5启动单个namenode节点, 注意,这个数时候启动的是格式化hdfs主机节点上的namenode
进入sbin目录下
./hadoop-daemon start namenode 启动master上的namenode服务
6 将master上namenode上的工作文件夹目录拷贝到slaver1上 通过一个命令就可以拷贝过去(执行命令前提是master主机上的hdfs启动成功) 在slaver1主机上执行以下命令:
cd /usr/hadoop/hadoop2.5.1/bin
./hdfs namenode -bootstrapstandby
7 initaling HA state zookeeper 初始化HA集群中zookeeper的状态 在master主机上执行以下命令
cd /usr/hadoop/hadoop2.5.1/bin
./hdfs zkfc -formatZK
通过这个命令执行后我们的ZKFC就能成功启动。执行jps命令如果有有DFSZKFailoverController进程出现则代表zkfc服务启动成功。
8 停止master节点上停止单个namendoe服务
cd /usr/hadoop/hadoop2.5.1/bin
./hadoop-daemon stop namenode