您的位置:首页 > 运维架构

Hadoop2.2.0基于QJM的HA实践

2014-01-05 22:44 197 查看
日志分析集群已经搭建起来了,但是我总觉得NN没有采用HA是一个大大的隐忧,让我一直不敢把测试集群正式投入使用,总是担心把大批量的日志文件弄过来后,NN挂掉或者硬盘故障的话那就什么都白费工夫,遂决定要把NN的HA也搞起来。

Hadoop2.2.0的NN的HA目前有两种方式,贫民的方式自然是QJM了,它会采用类似Zookeepr的方式来保存NN的LOG,而NFS的模式显然不是我等几台机器组成的集群的选项,那是高大上的土豪们的选择。

话说QJM也不是很难配置的,基于之前搭建的测试集群只要稍微调整下配置即可。我这里采用的是lrts216、lrts217作为主备NN节点,lrts216、lrts217、lrts218则分别作为journal节点,另外也要在lrts216、lrts217、lrts218三台机器上分别搭建Zookeeper3.4.5构成一个ZK的集群,来实现NN的自动切换。

(1)搭建Zookeeper的集群

在我的3台测试机器lrts216、lrts217、lrts218上搭建Zookeeper集群,采用的版本为3.4.5,这个搭建比较简单,可以一找一大把的资料。

(2)修改Hadoop的配置,支持QJM

在/home/hadoop/hadoop-2.2.0/etc/hadoop/hdfs-site.xml中追加:

<property>
<name>dfs.nameservices</name>
<value>lrtscluster</value>
</property>

<property>
<name>dfs.ha.namenodes.lrtscluster</name>
<value>nn216,nn217</value>
</property>

<property>
<name>dfs.namenode.rpc-address.lrtscluster.nn216</name>
<value>lrts216:8020</value>
</property>

<property>
<name>dfs.namenode.rpc-address.lrtscluster.nn217</name>
<value>lrts217:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.lrtscluster.nn216</name>
<value>lrts216:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.lrtscluster.nn217</name>
<value>lrts217:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://lrts216:8485;lrts217:8485;lrts218:8485/lrtscluster
</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.lrtscluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
</value>
</property>

<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/hadoop-2.2.0/journal</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
同时要修改下原来的配置,注释掉原来对dfs.namenode.http-address的配置:

<!--
<property>
<name>dfs.namenode.http-address</name>
<value>lrts216:50070</value>
<description>
The address and the base port where the dfs namenode web ui will listen on.
</description>
</property>
-->


另外一个需要追加修改的配置/home/hadoop/hadoop-2.2.0/etc/hadoop/core-site.xml:

<property>
<name>fs.defaultFS</name>
<value>hdfs://lrtscluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>lrts216:2181,lrts217:2181,lrts218:2181</value>
</property>

注意:上述fs.defaultFS部分千万不能忘记了,否则就大大错了!在本篇文章最初写就的时候,这一段漏了,估计有好些朋友会吃亏的,感谢5楼@ wjhdtx同学的提醒!

(3)HA初始化

由于我这里的Hadoop集群是测试集群,之前没有特重要的数据,所以事情变得简单多了。

3.1、保持一个彻底干净的环境

先把NameNode、DataNode、journalNode的数据目录以及日志删除掉,以一个彻底干净的面貌来开始使用。

在Hadoop的各节点执行如下命令:

rm -rf /home/hadoop/hadoop-2.2.0/logs/*

rm -rf /home/hadoop/hadoop-2.2.0/dfs/name/*

rm -rf /home/hadoop/hadoop-2.2.0/dfs/data/*

rm -rf /home/hadoop/hadoop-2.2.0/journal/lrtscluster/*

格式化zkfc:

/home/hadoop/hadoop-2.2.0/bin/hdfs zkfc -formatZK

3.2、启动journal

分别在lrts216、lrts217、lrts218这3台机器下执行命令来启动journalnode:

/home/hadoop/hadoop-2.2.0/sbin/hadoop-daemon.sh start journalnode

可以通过http://lrts216:8480来看journal是否正常;

3.3、格式化NN

在任意一个NameNode节点执行如下命令来格式化当前命名节点:

/home/hadoop/hadoop-2.2.0/bin/hdfs
namenode -format

注意:

这个需要当前被格式化的NameNode中/home/hadoop/hadoop-2.2.0/dfs/name目录下的内容COPY到另外一个nameNode对应目录中去,否则会导致两个NameNode都处于Standby状态。由于整个的配置是使用NameNode的自动Failover的,所以需要强制切一个NN为Active状态,但是并不好使,甚至还会导致脑裂的问题产生,嘿,本人遇到了一次。

在这里受阻过一次,简直是刻骨铭心了。

3.4、启动HDFS

./start-dfs.sh启动hadoop集群。

参考:

http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html

/article/11213957.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: