Hadoop2的HA安装(high availability):JournalNode+ zookeeper

前面介绍过使用NFS+zookeeper来解决namenode单点失败问题,因为NFS可能也会存在单点问题,所以hadoop提供了一种叫做JournalNode技术,这项技术可以在JournalNode节点间共享数据

我们来介绍这一种技术:JournalNode+ zookeeper

Hadoop 版本:2.6.0

OS 版本: Centos6.5

Jdk 版本: jdk1.7.0_60

环境配置

机器名

Ip地址

功能

centos-one

192.168.50.173

NameNode, DataNode,

ResourceManager, NodeManager

Zookeeper

Zkfc

JournalNode

centos-two

192.168.0.74

NameNode

DataNode, NodeManager

Zookeeper

Zkfc

JournalNode

centos-three

192.168.0.75

DataNode, NodeManager

Zookeeper

Zkfc

JournalNode

一、zookeeper配置

上传zookeeper-3.4.5.tar.gz
解压缩    tar xzvf zookeeper-3.4.5.tar.gz
 
[hadoop@centos-one app]$ cd /home/hadoop/app/zookeeper-3.4.5/conf
[hadoop@centos-one conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@centos-one conf]$ vi zoo.cfg
dataDir=/home/hadoop/app/zookeeper-3.4.5/mydata
dataLogDir=/home/hadoop/app/zookeeper-3.4.5/logs

server.1=192.168.50.173:2888:3888
server.2=192.168.0.74:2888:3888
server.3=192.168.0.75:2888:3888
[hadoop@centos-one conf]$ cd ..
[hadoop@centos-one zookeeper-3.4.5]$ mkdir mydata
[hadoop@centos-one zookeeper-3.4.5]$ touch mydata/myid
myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字
[hadoop@centos-one zookeeper-3.4.5]$ mkdir logs
[hadoop@centos-one zookeeper-3.4.5]$ cd ..
[hadoop@centos-one app]$ scp -r zookeeper-3.4.5 centos-two:/home/hadoop/app/
[hadoop@centos-one app]$ scp -r zookeeper-3.4.5 centos-three:/home/hadoop/app/
[hadoop@centos-one app]$ ssh -t -p 22  hadoop@centos-two "echo 2 >/home/hadoop/app/zookeeper-3.4.5/mydata/myid"
[hadoop@centos-one app]$ ssh -t -p 22  hadoop@centos-three"echo 3 >/home/hadoop/app/zookeeper-3.4.5/mydata/myid"

二、配置hadooper

sudo chown -R hadoop:hadoop hadoop-2.6.0

将 hadoop-2.6.0 的所有者与用户组改为hadoop

[hadoop@centos-one hadoop-2.6.0]$ cd /home/hadoop/app/hadoop-2.6.0/
[hadoop@centos-one hadoop-2.6.0]$ vi etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_60

修改JDK位置

[hadoop@centos-one hadoop-2.6.0]$ vi etc/hadoop/core-site.xml

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hadoop-2.6.0/mydata/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/app/hadoop-2.6.0/mydata/journal</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.50.173:2181,192.168.0.74:2181,192.168.0.75:2181</value>
</property>
</configuration>

[hadoop@centos-one hadoop-2.6.0]$ vi etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/app/hadoop-2.6.0/mydata/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/app/hadoop-2.6.0/mydata/data</value>
</property>
<property>
<name>dfs.datanode.hostname</name>
<value>192.168.50.173</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>centos-one,centos-two</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.centos-one</name>
<value>192.168.50.173:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.centos-one</name>
<value>192.168.50.173:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.centos-two</name>
<value>192.168.0.74:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.centos-two</name>
<value>192.168.0.74:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.50.173:8485;192.168.0.74:8485;192.168.0.75:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</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.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>

[hadoop@centos-one hadoop-2.6.0]$ vi etc/hadoop/yarn-site.xml

<configuration>
<property>
<description>the valid service name</description>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<description>The hostname of the RM.</description>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.50.173</value>
</property>
</configuration>

[hadoop@centos-one hadoop-2.6.0]$ vi etc/hadoop/mapred-site.xml

<configuration>
   <property>
   <name>mapreduce.framework.name</name>
   <value>yarn</value>
   </property>
</configuration>

[hadoop@centos-one hadoop-2.6.0]$ vi etc/hadoop/slaves

192.168.50.173
192.168.0.74
192.168.0.75

 部署hadoop安装包

 

[hadoop@centos-one hadoop-2.6.0]$ mkdir -p mydata/name
[hadoop@centos-one hadoop-2.6.0]$ mkdir -p mydata/data
[hadoop@centos-one hadoop-2.6.0]$ mkdir -p mydata/tmp
[hadoop@centos-one hadoop-2.6.0]$ mkdir -p mydata/journal
[hadoop@centos-one hadoop-2.6.0]$ mkdir -p mydata/yarn
[hadoop@centos-one hadoop-2.6.0]$ cd ..
[hadoop@centos-one app]$ scp -r hadoop-2.6.0 centos-two:/home/hadoop/app/
[hadoop@centos-one app]$ scp -r hadoop-2.6.0 centos-three:/home/hadoop/app/

 

 

三、运行hadoop

启动zookeeper,在centos-one,centos-two, centos-three上运行

[hadoop@centos-one hadoop-2.6.0]$ /home/hadoop/app/zookeeper-3.4.5/bin/zkServer.sh start

在centos-one 格式化namenode和failovercontroler

[hadoop@centos-one hadoop-2.6.0]$ cd /home/hadoop/app/hadoop-2.6.0

failovercontroler格式化:

bin/hdfs zkfc -formatZK

 

启动各节点JournalNode
[hadoop@centos-one hadoop-2.6.0]$ sbin/hadoop-daemon.sh start journalnode
[hadoop@centos-two hadoop-2.6.0]$ sbin/hadoop-daemon.sh start journalnode
[hadoop@centos-three hadoop-2.6.0]$ sbin/hadoop-daemon.sh start journalnode

 

在centos-one节点上运行:

bin/hdfs namenode -format -clusterid mycluster

 

在hadoop2节点上的namenode信息需要与hadoop1节点同步,不能通过简单的格式化做到,hadoop2节点上的namenode需要向hadoop1的namenode发送数据请求。因此我们还需要启动hadoop1上的namenode.

  在centos-one上运行: bin/hdfs namenode

  在centos-two上运行:bin/hdfs namenode  -bootstrapStandby

最后关闭centos-one上的namenode,然后启动整个hadoop集群。

启动hadoop集群

[hadoop@centos-one hadoop-2.6.0]$ /home/hadoop/app/hadoop-2.6.0/sbin/start-all.sh

从图上可以看出,先启动namenode,再启动datanode, 再启动journalnode, 再启动ZK failover controller, 再启动resourcemanger, 最后启动nodemanager。

使用jps查看启动的进程

在centos-one上运行jps

在centos-two上运行jps

在centos-three上运行jps

查看namenode的状态

  bin/hdfs haadmin -getServiceState centos-one

 

  bin/hdfs haadmin -getServiceState centos-two

从图上可以看出hadoop2上的namenode处于active状态,而hadoop1上的namenode处于standby状态

这些信息也可以通过Hadoop的web界面得到。

在浏览器里输入:http://hadoop1:50070

 

在浏览器里输入:http://hadoop2:50070

 

 

参考:

http://www.cnblogs.com/easycloud/p/3724908.html

http://mmicky.blog.163.com/blog/static/150290154201401812127758/

posted @ 2014-06-05 16:57  forbesyan  阅读(361)  评论(0)    收藏  举报