2014-01-14---Hadoop的基础学习(八)---HDFS的HA机制及Hadoop集群搭建
2014-01-14---Hadoop的基础学习(八)---HDFS的HA机制及Hadoop集群搭建
查封炉台 发表于3年前
2014-01-14---Hadoop的基础学习(八)---HDFS的HA机制及Hadoop集群搭建
  • 发表于 3年前
  • 阅读 94
  • 收藏 3
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 前面的博文讲到,HDFS的NameNode如何保持高可用性,其中突出的问题就是单点故障.NameNode就好比的人的心脏,非常的重要,绝对是不可以停止工作的。在Hadoop1.x中,如果NameNode丢失数据或者是不能工作。那么整个集群就无法正常工作啦。在Hadoop2.x 就解决这个问题.

1.HA的简介

Background

Prior to Hadoop 2.0.0, the NameNode was a single point of failure (SPOF) in an HDFS cluster. Each cluster had a single NameNode, and if that machine or process became unavailable, the cluster as a whole would be unavailable until the NameNode was either restarted or brought up on a separate machine.

This impacted the total availability of the HDFS cluster in two major ways:

  • In the case of an unplanned event such as a machine crash, the cluster would be unavailable until an operator restarted the NameNode.

  • Planned maintenance events such as software or hardware upgrades on the NameNode machine would result in windows of cluster downtime.

The HDFS High Availability feature addresses the above problems by providing the option of running two redundant NameNodes in the same cluster in an Active/Passive configuration with a hot standby. This allows a fast failover to a new NameNode in the case that a machine crashes, or a graceful administrator-initiated failover for the purpose of planned maintenance.

这一段英文用有道翻译了一下.就是说以前的机制怎么怎么不行,要改进什么什么!就是主要解决NameNode节点的单点故障,然后说更新后的NameNode可以如何保持高可用性,就是crash挂掉了,也可以快速的恢复。其实我们能想到就是搞主从备份的策略,但是往往说起来容易,实现就可复杂。接下来,让我们就来看看....

还是用图来说明吧:

Hadoop1.x:

Hadoop2.x:

hadoop2中HDFS的高可靠指的是可以同时启动2个NameNode。其中一个处于工作状态,另一个处于随时待命状态。

这样,当一个NameNode所在的服务器宕机时,可以在数据不丢失的情况下,手工或者自动切换到另一个NameNode提供服务。 这些NameNode之间通过共享数据,保证数据的状态一致。多个NameNode之间共享数据,可以通过Nnetwork File System或者Quorum Journal Node。前者是通过linux共享的文件系统,属于操作系统的配置;后者是hadoop自身的东西,属于软件的配置。我们这里讲述使用Quorum Journal Node的配置方式。可以使人工,也可以自动配置(使用zookeeper就行啦).

至于NFS的配置方法,访问:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html

看apache上的文档要比我这好多太多,上面的资料给的比较全面。搞的我都不想写博客了!!!

集群启动时,可以同时启动2个NameNode。这些NameNode只有一个是active的,另一个属于standby状态。

active状态意味着提供服务,standby状态意味着处于休眠状态,只进行数据同步,时刻准备着提供服务 。

2.Hadoop2中HA的架构

      在一个典型的HA集群中,每个NameNode是一台独立的服务器。在任一时刻,只有一个NameNode处于active状态,另一个处于standby状态。其中,active状态的NameNode负责所有的客户端操作,standby状态的NameNode处于从属地位,维护着数据状态,随时准备切换。 

      两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了,如图所示:

为了确保快速切换,standby状态的NameNode有必要知道集群中所有数据块的位置。为了做到这点,所有的datanodes必须配置两个NameNode的地址,发送数据块位置信息和心跳给他们两个。 

对于HA集群而言,确保同一时刻只有一个NameNode处于active状态是至关重要的。否则,两个NameNode的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,JNS必须确保同一时刻只有一个NameNode可以向自己写数据。 

      注意:在HA集群中,standby状态的NameNode可以完成checkpoint操作,因此没必要配置Secondary NameNode、CheckpointNode、BackupNode。如果真的配置了,还会报错。

3.自动故障转移

    有一个洋气的名字叫做automaticaly failover.

    而手动故障转移配置叫做configure a manual failover.也就是说,在手动的模式下,系统不会自动启动故障转移,就是Active----》Stanby的过程。就必须执行一条命令: hdfs haadmin -failover --forcefence serviceId serviced2.就会把状态进行安全的切换。其中serviceId2就会变成active状态.

    但是自动就没有这样简单啦,自动故障处理需要两个组件:a ZooKeeper quorum和ZKFailoverController进程(简称ZKFC).在其中ZooKeeper主要做两件事:

      Failure detection故障检测,集群中的每个NameNode机器的持久会话都会在ZooKeeper管理保存,如果机器崩溃的话,zookeeper就会将会话到期,然后通知另一个故障转移会被触发.

      Active NameNode election:Active NameNode的选举,zookeeper提供了一个简单的机制来专门选择一个节点作为活跃。如果当前活动NameNode崩溃,另一个节点可能拿到一个特殊的互斥型锁用来表明它应该成为下一个active NameNode。

      ZKFailoverController实际上是zookeeper的一个客户端,同时监控和管理着NameNode的状态,每一个跑着ZKFC的NameNode,都有下面的作用:

       健康的监控,ZooKeeper会话管理,Zookeeper基础选举.

4.Hadoop集群的机器分配

    硬件:7台CentOS虚拟机,内存512,硬盘20G.

    网络:

主机 IP 安装的软件
yun10-1 192.168.2.11  jdk、hadoop
yun10-2 192.168.2.12 jdk、hadoop
yun10-3 192.168.2.13 jdk、hadoop
yun10-4 192.168.2.14 jdk、hadoop
yun10-5 192.168.2.15 jdk、hadoop、zookeeper
yun10-6 192.168.2.16 jdk、hadoop、zookeeper
yun10-7 192.168.2.17 jdk、hadoop、zookeeper

    服务:

yun10-1 namenode zkfc

yun10-2 namenode zkfc

yun10-3


resourcemanager
yun10-4


resourcemanager
yun10-5 datanode journalNode QuorumPeerMain nodemanager
yun10-6 datanode journalNode QuorumPeerMain nodemanager
yun10-7 datanode journalNode QuorumPeerMain nodemanager

     说明:

1.在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对    外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速    进行切换。hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM     在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode     即认为写入成功。通常配置奇数个JournalNode.这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverCont      roller)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态。

2.hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop-2.4.1解决了这个问       题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调。

5.安装配置zookeeper集群

   省略.见链接:http://my.oschina.net/codeWatching/blog/367309

6.安装配置Hadoop集群

  Hadoop的配置文件集中在/etc/hadoop/下

 a.修改hadoop-env.sh

    export JAVA_HOME=/home/lisai/app/jdk1.7.0_55

  b.修改core-site.xml

  c.修改hdfs-site.xml

 

  d.修改mapred-site.xml

  e.修改yarn-site.xml

f.修改slaves(slaves是指定子节点的位置,因为要在yun10-1上启动HDFS、在yun10-3启动yarn,所以yun10-1上的slaves文件指定的是datanode的位置,在yun10-3上的slaves文件指定的是nodemanager的位置)

    yun10-5

    yun10-6

    yun10-7

g.配置免密码登陆

#首先要配置yun10-1到yun10-2、yun10-3、yun10-4、yun10-5、yun10-6、yun10-7的免密码登陆

#在yun10-1上生产一对钥匙

ssh-keygen -t rsa

#将公钥拷贝到其他节点,包括自己

ssh-coyp-id yun10-1

ssh-coyp-id yun10-2

ssh-coyp-id yun10-3

ssh-coyp-id yun10-4

ssh-coyp-id yun10-5

ssh-coyp-id yun10-6

ssh-coyp-id yun10-7

#配置yun10-3到yun10-4、yun10-5、yun10-6、yun10-7的免密码登陆

#在yun10-3上生产一对钥匙

ssh-keygen -t rsa

#将公钥拷贝到其他节点

ssh-coyp-id yun10-4

ssh-coyp-id yun10-5

ssh-coyp-id yun10-6

ssh-coyp-id yun10-7

#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置yun10-2到yun10-1的免登陆

在yun10-2上生产一对钥匙

ssh-keygen -t rsa

ssh-copy-id -i yun10-1

7.配置信息的拷贝

scp -r ./hadoop/ yun10-2:/home/lisai/app/hadoop-2.4.1/etc/hadoop/
scp -r ./hadoop/ yun10-3:/home/lisai/app/hadoop-2.4.1/etc/hadoop/
scp -r ./hadoop/ yun10-4:/home/lisai/app/hadoop-2.4.1/etc/hadoop/
scp -r ./hadoop/ yun10-5:/home/lisai/app/hadoop-2.4.1/etc/hadoop/
scp -r ./hadoop/ yun10-6:/home/lisai/app/hadoop-2.4.1/etc/hadoop/
scp -r ./hadoop/ yun10-7:/home/lisai/app/hadoop-2.4.1/etc/hadoop/

8.启动Hadoop集群

  a.启动ZooKeeper.

./bin/zkServer.sh start
./bin/zkserver.sh status

  b.启动journalnode(分别在在yun10-5、yun10-6、yun10-7上执行)

./sbin/hadoop-daemon.sh start journalnode
jps

   c.格式化HDFS

#在yun10-1上执行命令:
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件.
 这里我配置的是/home/lisai/app/hadoop-2.4.1/tmp,然后将/home/lisai/app/hadoop-2.4.1/tmp拷贝到yun10-2的/home/lisai/app/hadoop-2.4.1下。
scp -r tmp/ yun10-2:/home/lisai/app/hadoop-2.4.1/tmp

   d.格式化ZK

#在yun10-1执行
hdfs zkfc -formatZK

  d.启动HDFS

#在yun10-1执行NameNode进程
./sbin/start-hdfs.sh
#在yun10-2执行NameNode进程
./sbin/hadoop-daemon.sh start NameNode/可能是小写.
#在yun10-5,yun10-6,yun10-7三台别人启动 
./sbin/hadoop-daemon.sh start datanode

   e.启动YARN(#####注意#####:是在yun10-3上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)

#yun10-3
./sbin/start-yarn.sh
#yun10-4
./sbin/yarn-daemon.sh start resourcemanager

9.验证集群

         HDFS:http://yun10-1:50070

         MapReducer:http://yun10-3:8090

---------------------------------------END----------------------------------------------------------------------

共有 人打赏支持
粉丝 49
博文 56
码字总数 138491
×
查封炉台
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: