Hadoop高可用(HA)集群搭建


环境准备


1. 原理概述

(1) 为什么会有Hadoop HA机制?

HA:High Available,高可用
在Hadoop 2.0之前,在HDFS集群中NameNode存在单点故障 (SPOF:A Single Point of Failure)
对于只有一个NameNode的集群,如果NameNode机器出现故障(比如宕机或是软件、硬件升级),那么整个集群将无法使用,直到NameNode重新启动

(2) 如何解决?

HDFS的HA功能通过配置Active/Standby两个NameNode 实现在集群中对NameNode的热备来解决上述问题。

如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

在一个典型的HDFS(HA)集群中,使用多台单独的机器配置为 NameNode,在任何时间点,确保多个NameNode中只有一个处于 Active状态,其他的处在Standby状态。

其中ActiveNameNode负责集群中的所有客户端操作,StandbyNameNode仅仅充当备机,保证一旦ActiveNameNode出现问题能够快速切换。

为了能够实时同步Active和Standby两个NameNode的元数据信息(editlog),需提供一个共享存储系统,可以是NFS、QJM(Quorum Journal Manager)或者Zookeeper,ActiveNamenode将数据写入共享存储系统,而Standby监听该系统,一旦发现有新数据写入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与 ActiveNameNode保持基本一致,如此这般,在紧急情况下 standby便可快速切为 activenamenode。

为了实现快速切换,Standby节点获取集群的最新文件块信息也是很有必要的。为了实现这一目标,DataNode需要配置所有NameNode的位置,并同时给他们发送文件块信息以及心跳检测。

2. 集群规划

3. 安装步骤

(1) 把hadoop安装包上传到服务器并解压

tar zxvf hadoop-2.6.5.tar.gz -C /home/hadoop/apps/

(2) 修改 hadoop-env.sh、mapred-env.sh、yarn-env.sh 这三个配置文件,添加JAVA_HOME

hadoop的配置文件在HADOOP_HOME/etc/hadoop/下

export JAVA_HOME=/usr/local/jdk1.8.0_73

(3) 修改 core-site.xml

<configuration>
    <!--指定 hdfs 的 nameservice 为 jed(这个可以自定义)-->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://jed/</value>
    </property>
    
    <!-- 指定 hadoop 工作目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/hadoopdata/</value>
    </property>

    <!-- 指定 zookeeper 集群访问地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
    </property>
</configuration>

(4) 修改 hdfs-site.xml

<configuration>
    
    <!-- 指定副本数:不要超过datanode节点数量-->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>

    <!--指定 hdfs 的 nameservice 为 jed,需要和 core-site.xml 中保持一致-->
    <property>
        <name>dfs.nameservices</name>
        <value>jed</value>
    </property>

    <!-- jed 下面有两个 NameNode,分别是 nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.jed</name>
        <value>nn1,nn2</value>
    </property>

    <!-- nn1 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.jed.nn1</name>
        <value>hadoop01:9000</value>
    </property>
    <!-- nn1 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.jed.nn1</name>
        <value>hadoop01:50070</value>
    </property>
    <!-- nn2 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.jed.nn2</name>
        <value>hadoop02:9000</value>
    </property>
    <!-- nn2 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.jed.nn2</name>
        <value>hadoop02:50070</value>
    </property>

    <!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/jed</value>
    </property>

    <!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/journaldata</value>
    </property>

    <!-- 开启 NameNode 失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置失败自动切换实现方式 -->
    <!-- 此处配置较长,在安装的时候切记检查不要换行-->
    <property>
        <name>dfs.client.failover.proxy.provider.jed</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制占用一行-->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>

    <!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    
    <!-- 配置 sshfence 隔离机制超时时间(30s) -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    
</configuration>

(5) 修改 mapred-site.xml

集群中只有mapred-site.xml.template,可以从这个文件进行复制

cp mapred-site.xml.template mapred-site.xml
<configuration>
    <!-- 指定 mr 框架为 yarn 方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <!-- 设置 mapreduce 的历史服务器地址和端口号 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop01:10020</value>
    </property>

    <!-- mapreduce 历史服务器的 web 访问地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop01:19888</value>
    </property>
    
</configuration>

(6) 修改 yarn-site.xml

<configuration>
    <!-- 开启 RM 高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!-- 指定 RM 的 cluster id,可以自定义-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>jyarn</value>
    </property>

    <!-- 指定 RM 的名字,可以自定义 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <!-- 分别指定 RM 的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop03</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop04</value>
    </property>

    <!-- 指定 zk 集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
    </property>

    <!-- 要运行 MapReduce 程序必须配置的附属服务 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!-- 开启 YARN 集群的日志聚合功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <!-- YARN 集群的聚合日志最长保留时长 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <!--1天-->
        <value>86400</value>
    </property>

    <!-- 启用自动恢复 -->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
    </property>

    <!-- 制定 resourcemanager 的状态信息存储在 zookeeper 集群上-->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    
</configuration>

(7) 修改 slaves 配置文件,指定DataNode所在的节点

hadoop01
hadoop02
hadoop03
hadoop04

(8) 把hadoop安装包分发给其他节点

[hadoop@hadoop01 hadoop]# scp -r /home/hadoop/apps/hadoop-2.6.5 hadoop02:/home/hadoop/apps/
[hadoop@hadoop01 hadoop]# scp -r /home/hadoop/apps/hadoop-2.6.5 hadoop03:/home/hadoop/apps/
[hadoop@hado0p01 hadoop]# scp -r /home/hadoop/apps/hadoop-2.6.5 hadoop04:/home/hadoop/apps/

(9) 给每个节点配置HADOOP_HOME环境变量

vim ~/.bash_profile

export HADOOP_HOME=/home/hadoop/apps/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

(10) 启动zookeeper集群

保证zookeeper集群正常启动

zkServer.sh start

# 检查zookeeper集群是否正常
zkServer.sh status

(11) 分别在每个journalnode节点上启动journalnode进程

[hadoop@hadoop01 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop02 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop03 ~]$ hadoop-daemon.sh start journalnode

使用jps命令确认这3个节点上的JournalNode进程都启动

(12) 在第一个namenode节点(node01)上格式化文件系统

[hadoop@hadoop01 ~]# hadoop namenode -format

看到以下信息说明格式化成功:


(13) 同步两个namenode的元数据

查看你配置的hadoop.tmp.dir这个配置信息,得到hadoop工作的目录,我的是/home/hadoop/hadoopdata/,把hadoop01上的hadoopdata目录发送给hadoop02的相同路径下,这一步是为了同步两个namenode的元数据

[hadoop@hadoop01 ~]$ scp -r /home/hadoop/hadoopdata hadoop02:/home/hadoop/

也可以在hadoop02执行以下命令:

[hadoop@hadoop02 ~]# hadoop namenode -bootstrapStandby

(14) 格式化ZKFC(任选一个namenode节点格式化)

[hadoop@node01 ~]# hdfs zkfc -formatZK

看到如下信息说明ZKFC格式化成功


(15) 启动hdfs

[hadoop@hadoop01 ~]$ start-dfs.sh

(16) 启动yarn

[hadoop@hadoop03 zkdata]$ start-yarn.sh

# 需要在另外一个resourcemanager节点手动启动resourcemanager
[hadoop@hadoop04 zkdata]$ yarn-daemon.sh start resourcemanager

(17) 启动 mapreduce 任务历史服务器

[hadoop@hadoop01 ~]mr-jobhistory-daemon.sh start historyserver

3. 验证集群是否搭建成功

(1) 查看进程是否全部启动

根据集群的规划查看是否每个节点对应的进程都启动了

[hadoop@hadoop01 ~]$ jps
5906 DataNode
6420 Jps
5461 QuorumPeerMain
6347 DFSZKFailoverController
6028 NodeManager
5804 NameNode
5534 JournalNode
6515 JobHistoryServer

[hadoop@hadoop02 ~]$ jps
4096 DFSZKFailoverController
4176 Jps
3508 QuorumPeerMain
3911 NodeManager
3815 DataNode
3752 NameNode
3581 JournalNode

[hadoop@hadoop03 ~]$ jps
49825 DataNode
50002 NodeManager
50359 Jps
49657 QuorumPeerMain
49898 ResourceManager
49738 JournalNode

[hadoop@hadoop04 ~]$ jps
3332 DataNode
3240 QuorumPeerMain
3643 Jps
3406 NodeManager
3598 ResourceManager

(2) 查看HDFS状态

这里只展示部分

[hadoop@hadoop01 ~]$ hdfs dfsadmin -report

......
-------------------------------------------------
Live datanodes (4):

Name: 192.168.21.11:50010 (hadoop01)
Hostname: hadoop01
......

Name: 192.168.21.12:50010 (hadoop02)
Hostname: hadoop02
......

Name: 192.168.21.13:50010 (hadoop03)
Hostname: hadoop03
......

Name: 192.168.21.14:50010 (hadoop04)
Hostname: hadoop04
......

(3) 查看各节点的主备状态

[hadoop@hadoop01 ~]$ hdfs haadmin -getServiceState nn1
standby
[hadoop@hadoop01 ~]$ hdfs haadmin -getServiceState nn2
active
[hadoop@hadoop01 ~]$ yarn rmadmin -getServiceState rm1
active
[hadoop@hadoop01 ~]$ yarn rmadmin -getServiceState rm2
standby

(4) 访问WEB页面

  • 访问namenode


  • 访问resourcemanager,当访问到resourcemanager的备节点,会自动切换到主节点


  • 访问历史记录服务器


(5) 验证集群的功能是否正常

# 上传一个文件
[hadoop@hadoop01 ~]$ hdfs dfs -put ./zookeeper.out /
# 上传成功
[hadoop@hadoop01 ~]$ hdfs dfs -ls /
Found 2 items
drwxrwx---   - hadoop supergroup          0 2017-12-22 16:49 /tmp
-rw-r--r--   2 hadoop supergroup       1662 2017-12-22 17:06 /zookeeper.out

# 执行一个mapreduce例子程序
[hadoop@node01 mapreduce]# pwd
/home/hadoop/apps/hadoop-2.6.5/share/hadoop/mapreduce
[root@node02 mapreduce]# hadoop jar hadoop-mapreduce-examples-2.6.5.jar pi 5 5

# 执行成功,打印的记录最后一行有pi的结果
......
Estimated value of Pi is 3.68000000000000000000

(6) 验证集群高可用

# 杀死ActiveNameNode进程
[hadoop@hadoop02 ~]$ jps
......
5804 NameNode

[hadoop@hadoop02 ~]$ kill -9 5804

hadoop02现在不能访问


hadoop01切换为ActiveNameNode


重新启动hadoop02的namenode

[hadoop@hadoop02 ~]$ hadoop-daemon.sh start namenode

hadoop02的namenode并不会切换成ActiveNameNode,而是成为StandbyNamenode


到此,Hadoop HA集群搭建成功!

4. Hadoop HA集群的重装

  1. 删除所有节点中hadoop的工作目录(core-site.xml中配置的hadoop.tmp.dir那个目录)
  2. 如果你在core-site.xml中还配置了dfs.datanode.data.dirdfs.datanode.name.dir这两个配置,那么把这两个配置对应的目录也删除
  3. 删除所有节点中hadoop的log日志文件,默认在HADOOP_HOME/logs目录下
  4. 删除zookeeper集群中所关于hadoop的znode节点



    图中的红色框中的znode节点是与hadoop集群有关的,但rmstore这个节点不能删除,会报以下错误

Authentication is not valid : /rmstore/ZKRMStateRoot/RMVersionNode

所以删除另外两个就可以,重新格式化ZKFC的时候会询问是否覆盖rmstore这个节点,输入yes即可

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

推荐阅读更多精彩内容