如何搭建高可用Hadoop集群

在这篇文章中,我将讲述HDFS 2.x高可用集群架构和如何搭建一个高可用的HDFS集群。其内容如下:

  • HDFS HA架构

    • 介绍
    • NameNode高可用
    • HA架构
    • HA的实现(JournalNode和共享存储)
  • 如何设置Hadoop集群的HA(Quorum Journal Nodes)?

介绍

为了解决Hadoop1.x的单点故障问题,Hadoop2.x引入了高可用集群的概念。HDFS架构遵从Master/Slave拓扑,NameNode作为Master负责管理Slave节点(DataNode)。由于Master只有一个节点,因此它将成为整个系统的瓶颈。尽管引入的Secondary NameNode降低了NameNode中数据丢失的风险,但是它并没有解决NameNode高可用的问题。

NameNode可用性

如果使用HDFS的默认配置,NameNode会有单点故障的风险。当NameNode不可用的时候,整个系统将会是不可用的,直到NameNode重启或者引入新的NameNode。

NameNode的不可用的原因可能是以下几个方面:

  • 软件或者硬件的升级
  • NameNode的崩溃

HDFS高可用架构

HA架构通过设置两个NameNode(一主一备)来解决NameNode的可用性问题。因此,在一个高可用的集群中,将同时会有两个NameNode在运行。

  • Active NameNode
  • Standby/Passive NameNode
HDFS-HA-Architecture.png

如果一个NameNode挂了,另一个NameNode将会接管整个集群,从而减少集群的下线时间。备用的NameNode拥有集群的失败保护能力。因此当主节点挂了之后,通过被节点我们能够自动失败恢复。

但是,在保持HDFS高可用集群的一致性上,将会有以下两个问题:

  • 主备节点相互同步。拥有相同的元数据,可以使得主节点挂了之后,备节点可以快速的失败恢复。
  • 同时只能有一个主节点。当有两个主节点时,将会导致数据竞争。一个集群被分裂成两个小集群,这种场景被称为脑裂。为了避免这种场景的发生,必须建立一个栅栏来确保同时只有一个主节点。

HA架构的实现

在HDFS高可用架构中,同时运行有两个NameNode,一个主,一个备。它通过下面两种方式来实现主备节点配置。

  • 使用Quorum Journal Nodes
  • 使用NFS共享存储

Quorum Journal Nodes

JournalNode-HDFS-HA-Architecture.png
  • 主备节点通过一组独立的叫做JournalNodes的节点来保持数据同步。JournalNodes之间相互连接,然后把收到的请求信息复制到其他节点。
  • 主NameNode负责更新JournalNodes中的EditLogs(元信息)。
  • 备NameNode读取JournalNode中EditLogs中的变化,并且应用到它自己的命名空间。
  • 在失败恢复期间,备NameNode需要确保在称为主节点之间更新JournalNodes中的元信息。这使得当前的命名空间与失败之前的命名空间状态同步。
  • 两个NameNode的IP地址对于所有的DataNodes都是可见的。同时DataNodes发送心跳包和阻塞位置信息给两个NameNode。这样,由于备节点及时更新了集群的额阻塞信息,从而可以更快的恢复。

NameNode隔离

之前讨论过,同时只有一个主NameNode对整个集群来说是非常重要的。因此,NameNode之间的隔离就显得尤为重要。

  • JournalNodes只允许同时只有一个NameNode可以写日志。
  • 主节点挂之后,备节点负责写日志到JournalNodes,并且禁止其他NameNode再成为主节点。
  • 最后,备节点就转换为主节点。

使用共享存储

Shared-Storage-HDFS-HA-Architecture.png
  • 主备NameNode节点通过共享存储来保持同步。主NameNode把它在自己的命名空间中修改的日志打到共享存储的EditLog中。备节点读取共享存储中的EditLog,并更新到自己的命名空间中。
  • 在失败恢复的时候,备节点首先使用共享存储中的EditLog来更新元信息。然后,它就成为了主节点。这样,就使得当前的命名空间的状态跟失败恢复之前的状态同步。
  • 管理员必须配置至少一个栅栏方法来防止脑裂场景。
  • 系统可以使用很多栅栏隔离机制。比如杀死NameNode的进程和废除进入共享存储目录的权限。
  • 另外,我们可以使用STONITH技术来隔离先前的主节点。STONOTH使用专门的分布式单元来强制下线主NameNode机器。

自动失败恢复

失败恢复是指一种当检测到失败时,自动转换到次要系统。总共有两种失败恢复:

  • 优雅的失败恢复:手动初始化失败恢复。
  • 自动失败恢复:当NameNode挂了之后,自动初始化失败恢复程序。

Apache Zookeeper为HDFS高可用集群提供自动失败恢复的能力。它保持非常小的协调数据,通知客户端数据改变和监测客户端的失败。Zookeeper保持与NameNode的会话。在失败的情况下,会话将会过期,Zookeeper将通知其他NameNode初始化失败恢复程序。同时,其他备NameNode将会锁住Zookeeper,来使得自己成为主NameNode。

ZookeerFailoverController (ZKFC) 是一个Zookeeper客户端,能够监测和管理NameNode的状态。每个NameNode运行一个ZKFC。ZKFC负责周期性的监测NameNodes的健康状态。

现在我们了解了高可用的Hadoop集群,接下来就开始部署集群。

在主NameNode运行的后台程序有:

  • Zookeeper Fail Over controller
  • JournalNode
  • NameNode

备NamdeNode运行的后台程序有:

  • Zookeeper Fail Over controller
  • JournalNode
  • NameNode

DataNode上运行的后台程序有:

  • JournalNode
  • DataNode

搭建和配置Hadoop的高可用集群

1.每个节点设置JAVA环境和host。

虚拟机 IP地址 主机名
主NameNode 192.168.60.1 hadoop01
备NameNode 192.168.60.2 hadoop02
DataNode 192.168.60.3 hadoop03

2.每个节点设置ssh免密登录。

$ ssh-keygen -t rsa

一直按enter直到结束。当都生成ssh密钥后,你会得到一个公钥和私钥。

注意:.ssh目录的权限需要设置为700,.ssh目录里面文件的权设置为600。

然后把每台机器上的id_rsa.pub内容复制到authrozied_keys文件中。

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ ssh-copy-id –i .ssh/id_rsa.pub root@hadoop02
$ ssh-copy-id –i .ssh/id_rsa.pub root@hadoop03

接着重启所有节点的ssh服务。

$ service sshd restart

接着你可以通过ssh命令免密登录到其他机器上。如果还是需要密码,请检查以上设置是否正确。

3.下载和解压Hadoop和Zookeeper的二进制文件。

$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
$ wget https://archive.apache.org/dist/hadoop/core/hadoop-2.6.0/hadoop-2.6.0.tar.gz
$ tar –xvf zookeeper-3.4.6.tar.gz
$ tar –xvf hadoop-2.6.0.tar.gz

4设置hadoop环境。打开.bashrc文件。

$ vi ~/.bashrc

添加以下内容:

export HADOOP_HOME=< Path to your Hadoop-2.6.0 directory>
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export JAVA_HOME=<Path to your Java Directory>
export ZOOKEEPER_HOME =<Path to your Zookeeper Directory>
export PATH=$PATH: $JAVA_HOME/bin: $HADOOP_HOME/bin: $HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

5.设置hadoop配置文件

编辑core-site.xml文件,增加以下内容。

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ha-cluster</value>
    </property>
    
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/data/HA/jn</value>
    <property>
</configuration>

编辑hdfs-site.xml文件,增加以下内容

<property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/HA/namenode</value>
 </property>
 <property>
    <name>dfs.replication</name>
    <value>3</value>
 </property>
 <property>
    <name>dfs.permissions</name>
    <value>false</value>
 </property>
 <property>
    <name>dfs.nameservices</name>
    <value>ha-cluster</value>
 </property>
 <property>
    <name>dfs.ha.namenodes.ha-cluster</name>
    <value>nn1,nn2</value>
 </property>
 <property>
    <name>dfs.namenode.rpc-address.ha-cluster.nn1</name>
    <value>hadoop01:9000</value>
 </property>
 <property>
    <name>dfs.namenode.rpc-address.ha-cluster.nn2</name>
    <value>hadoop02:9000</value>
 </property>
 <property>
    <name>dfs.namenode.http-address.ha-cluster.nn1</name>
    <value>hadoop01:50070</value>
 </property>
 <property>
    <name>dfs.namenode.http-address.ha-cluster.nn2</name>
    <value>hadoop02:50070</value>
 </property>
 <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/ha-cluster</value>
 </property>
 <property>
    <name>dfs.client.failover.proxy.provider.ha-cluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
 </property>
 <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
 </property>
 <property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</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/root/.ssh/id_rsa</value>
 </property>
 <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/HA/app/name-ha</value>
 </property>
 <property>
    <name>dfs.data.dir</name>
    <value>/data/HA/app/tmp-ha</value>
 </property>

6.设置zookeeper配置文件

编辑zoo.cfg,增加以下内容

Server.1=hadoop01:2888:3888
Server.2=hadoop02:2888:3888
Server.3=hadoop03:2888:3888

7.拷贝文件到各个节点

完成上述步骤后,把上面设置过的.bashrc文件,hadoop目录,zookeeper目录通过scp命令复制到其他节点。

$ scp –r <path of directory> edureka@<ip address>:<path where you need to copy>

8.为zookeeper节点设置id。

在zookeeper的配置文件目录中,增加一个myid的文件。然后每个节点分别设置为1,2,3。

9.启动hadoop集群

在配置了journalnode的节点上启动journalnode。

$ hadoop-daemon.sh start journalnode

在主NameNode节点上格式化HDFS,并启动NameNode。

$ hdfs namenode -format
$ hadoop-daemon.sh start namenode

复制HDFS元信息到备NameNode,并启动备NameNode。

$ hdfs namenode -bootstrapStandby
$ hadoop-daemon.sh start namenode

在每个节点上启动zookeeper。

$ zkServer.sh start

在启动zookeeper服务后,你在每个节点上通过JPS命令可以看到QuorumPeerMain进程。

启动DataNode。

$ hadoop-daemon.sh start datanode

格式化zookeeper数据。

$ hdfs zkfc -formatZK

在主备NameNode启动启动ZKFC服务。

$ hadoop-daemon.sh start zkfc

参考

How to Set Up Hadoop Cluster with HDFS High Availability

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系...
    大佛爱读书阅读 849评论 0 0
  • Hadoop HA集群搭建文档.............................................
    钟敏_1788阅读 1,434评论 0 0
  • 首先还是先说一下Zookeeper在Hadoop集群的作用,以前我们学习Hadoop伪分布式的时候没有用到Zook...
    文子轩阅读 833评论 0 2
  • 若HDFS集群中只配置了一个NameNode,那么当该NameNode所在的节点宕机,则整个HDFS就不能进行文件...
    fad2aa506f5e阅读 594评论 0 5
  • 石州慢·寻支蛛缘 寻支蛛缘, 断崖倚树, 艳日明澈。 云岫凤鸾翔高, 碧天雄音亢越。 翅拍云动, 万朵团簇舞拥, ...
    寺咀山主人阅读 285评论 2 1