阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

配置高可用的Hadoop平台

124次阅读
没有评论

共计 19020 个字符,预计需要花费 48 分钟才能阅读完成。

1. 概述

在 Hadoop2.x 之后的版本,提出了解决单点问题的方案--HA(High Available 高可用)。这篇博客阐述如何搭建高可用的 HDFS 和 YARN,执行步骤如下:

  1. 创建 hadoop 用户
  2. 安装 JDK
  3. 配置 hosts
  4. 安装 SSH
  5. 关闭防火墙
  6. 修改时区
  7. ZK(安装,启动,验证)
  8. HDFS+HA 的结构图
  9. 角色分配
  10. 环境变量配置
  11. 核心文件配置
  12. slave
  13. 启动命令(hdfs 和 yarn 的相关命令)
  14. HA 的切换
  15. 效果截图

下面我们给出下载包的链接地址:

hadoop2.x 下载地址

zookeeper 下载地址

      JDK 下载地址

注:若 JDK 无法下载,请到 Oracle 的官网下载 JDK。

到这里安装包都准备好了,接下来我们开始搭建与配置。

2. 搭建

2.1 创建 Hadoop 用户

  1. useradd hadoop
  2. passwd hadoop

 然后根据提示,设置密码。接着我给 hadoop 用户设置面免密码权限,也可自行添加其他权限。

  1. chmod +w /etc/sudoers
  2. hadoop ALL=(root)NOPASSWD:ALL
  3. chmod w /etc/sudoers

2.2 安装 JDK

将下载好的安装包解压到 /usr/Java/jdk1.7,然后设置环境变量,命令如下:

  1. sudo vi /etc/profile

然后编辑配置,内容如下:

  1. export JAVA_HOME=/usr/java/jdk1.7
  2. export PATH=$PATH:$JAVA_HOME/bin

然后使环境变量立即生效,命令如下:

  1. source /etc/profile

然后验证 JDK 是否配置成功,命令如下:

  1. java version

若显示对应版本号,即表示 JDK 配置成功。否则,配置无效!

2.3 配置 hosts

集群中所有机器的 hosts 配置要要相同(推荐)。可以避免不必要的麻烦,用域名取代 IP,方便配置。配置信息如下:

  1. 10.211.55.12 nna # NameNode Active
  2. 10.211.55.13 nns # NameNode Standby
  3. 10.211.55.14 dn1 # DataNode1
  4. 10.211.55.15 dn2 # DataNode2
  5. 10.211.55.16 dn3 # DataNode3

然后用 scp 命令,将 hosts 配置分发到各个节点。命令如下:

  1. #这里以 NNS 节点为例子
  2. scp /etc/hosts hadoop@nns:/etc/

2.4 安装 SSH

输入如下命令:

  1. sshkeygen t rsa

然后一路按回车键,最后在将 id_rsa.pub 写到 authorized_keys,命令如下:

  1. cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

在 hadoop 用户下,需要给 authorized_keys 赋予 600 的权限,不然免密码登陆无效。在其他节点只需要使用 ssh-keygen –t rsa 命令,生产对应的公钥,然后将各个节点的 id_rsa.pub 追加到 nna 节点的 authorized_keys 中。最后,将 nna 节点下的 authorized_keys 文件通过 scp 命令,分发到各个节点的 ~/.ssh/ 目录下。目录如下:

  1. # 这里以 NNS 节点为例子
  2. scp ~/.ssh/authorized_keys hadoop@nns:~/.ssh/

  然后使用 ssh 命令相互登录,看是否实现了免密码登录,登录命令如下:

  1. # 这里以 nns 节点为例子
  2. ssh nns

若登录过程中木有提示需要输入密码,即表示密码配置成功。

2.5 关闭防火墙

由于 hadoop 的节点之间需要通信(RPC 机制),这样一来就需要监听对应的端口,这里我就直接将防火墙关闭了,命令如下:

  1. chkconfig iptables off

注:如果用于生产环境,直接关闭防火墙是存在安全隐患的,我们可以通过配置防火墙的过滤规则,即将 hadoop 需要监听的那些端口配置到防火墙接受规则中。关于防火墙的规则配置参见“linux 防火墙配置”,或者通知公司的运维去帮忙配置管理。

同时,也需要关闭 SELinux,可修改 /etc/selinux/config 文件,将其中的 SELINUX=enforcing 改为 SELINUX=disabled 即可。

2.6 修改时区

各个节点的时间如果不同步,会出现启动异常,或其他原因。这里将时间统一设置为 Shanghai 时区。命令如下:

  1. # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. cp: overwrite `/etc/localtime’? yes
  3. 修改为中国的东八区
  4. # vi /etc/sysconfig/clock
  5. ZONE=”Asia/Shanghai”
  6. UTC=false
  7. ARC=false

 

2.7ZK(安装,启动,验证)

2.7.1 安装

将下载好的安装包,解压到指定位置,这里为直接解压到当前位置,命令如下:

  1. tar zxvf zk-{version}.tar.gz

修改 zk 配置,将 zk 安装目录下 conf/zoo_sample.cfg 重命名 zoo.cfg,修改其中的内容:

  1. # The number of milliseconds of each tick
  2. # 服务器与客户端之间交互的基本时间单元(ms)
  3. tickTime=2000
  4.  
  5. # The number of ticks that the initial
  6. # synchronization phase can take
  7. # zookeeper 所能接受的客户端数量
  8. initLimit=10
  9.  
  10. # The number of ticks that can pass between
  11. # sending a request and getting an acknowledgement
  12. # 服务器和客户端之间请求和应答之间的时间间隔
  13. syncLimit=5
  14.  
  15. # the directory where the snapshot is stored.
  16. # do not use /tmp for storage, /tmp here is just
  17. # example sakes.
  18. # 保存 zookeeper 数据,日志的路径
  19. dataDir=/home/hadoop/data/zookeeper
  20.  
  21. # the port at which the clients will connect
  22. # 客户端与 zookeeper 相互交互的端口
  23. clientPort=2181
  24. server.1= dn1:2888:3888
  25. server.2= dn2:2888:3888
  26. server.3= dn3:2888:3888
  27.  
  28. #server.A=B:C:D
    # 其中 A 是一个数字,代表这是第几号服务器;B 是服务器的 IP 地址;
    #C 表示服务器与群集中的“领导者”交换信息的端口;当领导者失效后,D 表示用来执行选举时服务器相互通信的端口。

接下来,在配置的 dataDir 目录下创建一个 myid 文件,里面写入一个 0 -255 之间的一个随意数字,每个 zk 上这个文件的数字要是不一样的,这些数字应该是从 1 开始,依次写每个服务器。文件中序号要与 dn 节点下的 zk 配置序号一直,如:server.1=dn1:2888:3888,那么 dn1 节点下的 myid 配置文件应该写上 1。

2.7.2 启动

分别在各个 dn 节点启动 zk 进程,命令如下:

  1. bin/zkServer.sh start

然后,在各个节点输入 jps 命令,会出现如下进程:

  1. QuorumPeerMain

2.7.3 验证

上面说的输入 jps 命令,若显示对应的进程,即表示启动成功,同样我们也可以输入 zk 的状态命令查看,命令如下:

  1. bin/zkServer.sh status

会出现一个 leader 和两个 follower。

2.8HDFS+HA 的结构图

HDFS 配置 HA 的结构图如下所示:

配置高可用的 Hadoop 平台

上图大致架构包括:

1. 利用共享存储来在两个 NN 间同步 edits 信息。以前的 HDFS 是 share nothing but NN,现在 NN 又 share storage,这样其实是转移了单点故障的位置,但中高端的存储设备内部都有各种 RAID 以及冗余硬件,包括电源以及网卡等,比服务器的可靠性还是略有 提高。通过 NN 内部每次元数据变动后的 flush 操作,加上 NFS 的 close-to-open,数据的一致性得到了保证。

2. DN 同时向两个 NN 汇报块信息。这是让 Standby NN 保持集群的最新状态的必须步骤。

3. 用于监视和控制 NN 进程的 FailoverController 进程。显然,我们不能在 NN 进程内部进行心跳等信息同步,最简单的原因,一次 FullGC 就可以让 NN 挂起十几分钟,所以,必须要有一个独立的短小精悍的 watchdog 来专门负责监控。这也是一个松耦合的设计,便于扩展或更改,目前版本里是 用 ZooKeeper(简称 ZK)来做同步锁,但用户可以方便的把这个 Zookeeper FailoverController(简称 ZKFC)替换为其他的 HA 方案或 leader 选举方案。

4. 隔离(Fencing),防止脑裂,就是保证在任何时候只有一个主 NN,包括三个方面:

 共享存储 fencing,确保只有一个 NN 可以写入 edits。

 客户端 fencing,确保只有一个 NN 可以响应客户端的请求。

 DN fencing,确保只有一个 NN 向 DN 下发命令,譬如删除块,复制块等等。

2.9 角色分配

名称

Host

职责

NNA

10.211.55.12

zkfc

NNS

10.211.55.13

zkfc

DN1

10.211.55.14

zookeeper

DN2

10.211.55.15

zookeeper

DN3

10.211.55.16

zookeeper

2.10 环境变量配置

这里列出了所有的配置,后面配置其他组件,可以参考这里的配置。配置完成后,输入:. /etc/profile(或 source /etc/profile)使之立即生效。严重是否环境变量配置成功与否,输入:echo $HADOOP_HOME,若输出对应的配置路径,即可认定配置成功。

注:hadoop2.x 以后的版本 conf 文件夹改为 etc 文件夹了

配置内容如下所示:

  1. export JAVA_HOME=/usr/java/jdk1.7
  2. export HADOOP_HOME=/home/hadoop/hadoop2.6.0
  3. export ZK_HOME=/home/hadoop/zookeeper3.4.6
  4. export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOM

Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程  http://www.linuxidc.com/Linux/2015-02/113487.htm

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-02/114044p2.htm

2.11 核心文件配置

注:这里特别提醒,配置文件中的路径在启动集群之前,得存在(若不存在,请事先创建)。下面为给出本篇文章需要创建的路径脚本,命令如下:

  1. mkdir p /home/Hadoop/tmp
  2. mkdir p /home/hadoop/data/tmp/journal
  3. mkdir p /home/hadoop/data/dfs/name
  4. mkdir p /home/hadoop/data/dfs/data
  5. mkdir p /home/hadoop/data/yarn/local
  6. mkdir p /home/hadoop/log/yarn
  • core-site.xml
  1. <?xml version=“1.0” encoding=“UTF-8”?>
  2. <configuration>
  3. <property>
  4. <name>fs.defaultFS</name>
  5. <value>hdfs://cluster1</value>
  6. </property>
  7.  
  8. <property>
  9. <name>io.file.buffer.size</name>
  10. <value>131072</value>
  11. </property>
  12. <property>
  13. <name>hadoop.tmp.dir</name>
  14. <value>/home/hadoop/tmp</value>
  15. </property>
  16. <property>
  17. <name>hadoop.proxyuser.hduser.hosts</name>
  18. <value>*</value>
  19. </property>
  20. <property>
  21. <name>hadoop.proxyuser.hduser.groups</name>
  22. <value>*</value>
  23. </property>
  24. <property>
  25. <name>ha.zookeeper.quorum</name>
  26. <value>dn1:2181,dn2:2181,dn3:2181</value>
  27. </property>
  28. </configuration>
  • hdfs-site.xml
  1. <?xml version=“1.0” encoding=“UTF-8”?>
  2. <configuration>
  3. <property>
  4. <name>dfs.nameservices</name>
  5. <value>cluster1</value>
  6. </property>
  7. <property>
  8. <name>dfs.ha.namenodes.cluster1</name>
  9. <value>nna,nns</value>
  10. </property>
  11. <property>
  12. <name>dfs.namenode.rpc-address.cluster1.nna</name>
  13. <value>nna:9000</value>
  14. </property>
  15. <property>
  16. <name>dfs.namenode.rpc-address.cluster1.nns</name>
  17. <value>nns:9000</value>
  18. </property>
  19.  
  20. <property>
  21. <name>dfs.namenode.http-address.cluster1.nna</name>
  22. <value>nna:50070</value>
  23. </property>
  24.  
  25. <property>
  26. <name>dfs.namenode.http-address.cluster1.nns</name>
  27. <value>nns:50070</value>
  28. </property>
  29. <property>
  30. <name>dfs.namenode.shared.edits.dir</name>
  31. <value>qjournal://dn1:8485;dn2:8485;dn3:8485/cluster1</value>
  32. </property>
  33.  
  34. <property>
  35. <name>dfs.client.failover.proxy.provider.cluster1</name>
  36. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  37. </property>
  38. <property>
  39. <name>dfs.ha.fencing.methods</name>
  40. <value>sshfence</value>
  41. </property>
  42. <property>
  43. <name>dfs.ha.fencing.ssh.private-key-files</name>
  44. <value>/home/hadoop/.ssh/id_rsa</value>
  45. </property>
  46. <property>
  47. <name>dfs.journalnode.edits.dir</name>
  48. <value>/home/hadoop/data/tmp/journal</value>
  49. </property>
  50. <property>
  51. <name>dfs.ha.automatic-failover.enabled</name>
  52. <value>true</value>
  53. </property>
  54. <property>
  55. <name>dfs.namenode.name.dir</name>
  56. <value>/home/hadoop/data/dfs/name</value>
  57. </property>
  58. <property>
  59. <name>dfs.datanode.data.dir</name>
  60. <value>/home/hadoop/data/dfs/data</value>
  61. </property>
  62. <property>
  63. <name>dfs.replication</name>
  64. <value>3</value>
  65. </property>
  66. <property>
  67. <name>dfs.webhdfs.enabled</name>
  68. <value>true</value>
  69. </property>
  70.  
  71. <property>
  72. <name>dfs.journalnode.http-address</name>
  73. <value>0.0.0.0:8480</value>
  74. </property>
  75. <property>
  76. <name>dfs.journalnode.rpc-address</name>
  77. <value>0.0.0.0:8485</value>
  78. </property>
  79. <property>
  80. <name>ha.zookeeper.quorum</name>
  81. <value>dn1:2181,dn2:2181,dn3:2181</value>
  82. </property>
  83.  
  84. </configuration>
  • map-site.xml
  1. <?xml version=“1.0” encoding=“UTF-8”?>
  2. <configuration>
  3. <property>
  4. <name>mapreduce.framework.name</name>
  5. <value>yarn</value>
  6. </property>
  7. <property>
  8. <name>mapreduce.jobhistory.address</name>
  9. <value>nna:10020</value>
  10. </property>
  11. <property>
  12. <name>mapreduce.jobhistory.webapp.address</name>
  13. <value>nna:19888</value>
  14. </property>
  15. </configuration>
  • yarn-site.xml
  1. <?xml version=“1.0” encoding=“UTF-8”?>
  2. <configuration>
  3. <property>
  4. <name>yarn.resourcemanager.connect.retry-interval.ms</name>
  5. <value>2000</value>
  6. </property>
  7. <property>
  8. <name>yarn.resourcemanager.ha.enabled</name>
  9. <value>true</value>
  10. </property>
  11. <property>
  12. <name>yarn.resourcemanager.ha.rm-ids</name>
  13. <value>rm1,rm2</value>
  14. </property>
  15. <property>
  16. <name>ha.zookeeper.quorum</name>
  17. <value>dn1:2181,dn2:2181,dn3:2181</value>
  18. </property>
  19.  
  20. <property>
  21. <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
  22. <value>true</value>
  23. </property>
  24. <property>
  25. <name>yarn.resourcemanager.hostname.rm1</name>
  26. <value>nna</value>
  27. </property>
  28.  
  29. <property>
  30. <name>yarn.resourcemanager.hostname.rm2</name>
  31. <value>nns</value>
  32. </property>
  33. <!– 在 namenode1 上配置 rm1, 在 namenode2 上配置 rm2, 注意:一般都喜欢把配置好的文件远程复制到其它机器上,但这个在 YARN 的另一个机器上一定要修改 –>
  34. <property>
  35. <name>yarn.resourcemanager.ha.id</name>
  36. <value>rm1</value>
  37. </property>
  38. <!– 开启自动恢复功能 –>
  39. <property>
  40. <name>yarn.resourcemanager.recovery.enabled</name>
  41. <value>true</value>
  42. </property>
  43. <!– 配置与 zookeeper 的连接地址 –>
  44. <property>
  45. <name>yarn.resourcemanager.zk-state-store.address</name>
  46. <value>dn1:2181,dn2:2181,dn3:2181</value>
  47. </property>
  48. <property>
  49. <name>yarn.resourcemanager.store.class</name>
  50. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  51. </property>
  52. <property>
  53. <name>yarn.resourcemanager.zk-address</name>
  54. <value>dn1:2181,dn2:2181,dn3:2181</value>
  55. </property>
  56. <property>
  57. <name>yarn.resourcemanager.cluster-id</name>
  58. <value>cluster1-yarn</value>
  59. </property>
  60. <!–schelduler 失联等待连接时间 –>
  61. <property>
  62. <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
  63. <value>5000</value>
  64. </property>
  65. <!– 配置 rm1 –>
  66. <property>
  67. <name>yarn.resourcemanager.address.rm1</name>
  68. <value>nna:8132</value>
  69. </property>
  70. <property>
  71. <name>yarn.resourcemanager.scheduler.address.rm1</name>
  72. <value>nna:8130</value>
  73. </property>
  74. <property>
  75. <name>yarn.resourcemanager.webapp.address.rm1</name>
  76. <value>nna:8188</value>
  77. </property>
  78. <property>
  79. <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
  80. <value>nna:8131</value>
  81. </property>
  82. <property>
  83. <name>yarn.resourcemanager.admin.address.rm1</name>
  84. <value>nna:8033</value>
  85. </property>
  86. <property>
  87. <name>yarn.resourcemanager.ha.admin.address.rm1</name>
  88. <value>nna:23142</value>
  89. </property>
  90. <!– 配置 rm2 –>
  91. <property>
  92. <name>yarn.resourcemanager.address.rm2</name>
  93. <value>nns:8132</value>
  94. </property>
  95. <property>
  96. <name>yarn.resourcemanager.scheduler.address.rm2</name>
  97. <value>nns:8130</value>
  98. </property>
  99. <property>
  100. <name>yarn.resourcemanager.webapp.address.rm2</name>
  101. <value>nns:8188</value>
  102. </property>
  103. <property>
  104. <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
  105. <value>nns:8131</value>
  106. </property>
  107. <property>
  108. <name>yarn.resourcemanager.admin.address.rm2</name>
  109. <value>nns:8033</value>
  110. </property>
  111. <property>
  112. <name>yarn.resourcemanager.ha.admin.address.rm2</name>
  113. <value>nns:23142</value>
  114. </property>
  115. <property>
  116. <name>yarn.nodemanager.aux-services</name>
  117. <value>mapreduce_shuffle</value>
  118. </property>
  119. <property>
  120. <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  121. <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  122. </property>
  123. <property>
  124. <name>yarn.nodemanager.local-dirs</name>
  125. <value>/home/hadoop/data/yarn/local</value>
  126. </property>
  127. <property>
  128. <name>yarn.nodemanager.log-dirs</name>
  129. <value>/home/hadoop/log/yarn</value>
  130. </property>
  131. <property>
  132. <name>mapreduce.shuffle.port</name>
  133. <value>23080</value>
  134. </property>
  135. <!– 故障处理类 –>
  136. <property>
  137. <name>yarn.client.failover-proxy-provider</name>
  138. <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
  139. </property>
  140. <property>
  141. <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
  142. <value>/yarn-leader-election</value>
  143. </property>
  144. </configuration>
  • hadoop-env.sh
  1. # The Java implementation to use.
  2. export JAVA_HOME=/usr/java/jdk1.7
  • yarn-env.sh
  1. # some Java parameters
  2. export JAVA_HOME=/usr/java/jdk1.7
  • 2.12slave

修改 hadoop 安装目录下的 slave 文件:

  1. dn1
  2. dn2
  3. dn3

2.13 启动命令(hdfs 和 yarn 的相关命令)

由于我们配置了 QJM,所以我们需要先启动 QJM 的服务,启动顺序如下所示:

  1. 进入到 DN 节点,启动 zk 的服务:zkServer.sh start,之后可以输入 zkServer.sh status 查看启动状态,本次我们配置了三个 DN 节点,会出现一个 leader 和两个 follower。输入jps,会显示启动进程:QuorumPeerMain
  2. 在 NN 节点上(选一台即可,这里我选择的是一台预 NNA 节点),然后启动 journalnode 服务,命令如下:hadoop-daemons.sh start journalnode。或者单独进入到每个 DN 输入启动命令:hadoop-daemon.sh start journalnode。输入 jps 显示启动进程:JournalNode
  3. 接着若是配置后,我们首次启动,需要格式化 HDFS,命令如下:hadoop namenode –format
  4. 之后我们需要格式化 ZK,命令如下:hdfs zkfc –formatZK
  5. 接着我们启动 hdfs 和 yarn,命令如下:start-dfs.shstart-yarn.sh,我们在 nna 输入 jps 查看进程,显示如下:DFSZKFailoverControllerNameNodeResourceManager
  6. 接着我们在 NNS 输入 jps 查看,发现只有 DFSZKFailoverController 进程,这里我们需要手动启动 NNS 上的 namenodeResourceManager进程,命令如下:hadoop-daemon.sh start namenodeyarn-daemon.sh start resourcemanager。需要注意的是,在 NNS 上的 yarn-site.xml 中,需要配置指向 NNS,属性配置为 rm2,在 NNA 中配置的是 rm1。
  7. 最后我们需要同步 NNA 节点的元数据,命令如下:hdfs namenode –bootstrapStandby,若执行正常,日志最后显示如下信息:
  1. 15/02/2110:30:59 INFO common.Storage:Storage directory /home/hadoop/data/dfs/name has been successfully formatted.
  2. 15/02/2110:30:59 WARN common.Util:Path/home/hadoop/data/dfs/name should be specified as a URI in configuration files.Please update hdfs configuration.
  3. 15/02/2110:30:59 WARN common.Util:Path/home/hadoop/data/dfs/name should be specified as a URI in configuration files.Please update hdfs configuration.
  4. 15/02/2110:31:00 INFO namenode.TransferFsImage:Opening connection to http://nna:50070/imagetransfer?getimage=1&txid=0&storageInfo=-60:1079068934:0:CID-1dd0c11e-b27e-4651-aad6-73bc7dd820bd
  5. 15/02/2110:31:01 INFO namenode.TransferFsImage:ImageTransfer timeout configured to 60000 milliseconds
  6. 15/02/2110:31:01 INFO namenode.TransferFsImage:Transfer took 0.01s at 0.00 KB/s
  7. 15/02/2110:31:01 INFO namenode.TransferFsImage:Downloaded file fsimage.ckpt_0000000000000000000 size 353 bytes.
  8. 15/02/2110:31:01 INFO util.ExitUtil:Exitingwith status 0
  9. 15/02/2110:31:01 INFO namenode.NameNode: SHUTDOWN_MSG:/************************************************************ SHUTDOWN_MSG: Shutting down NameNode at nns/10.211.55.13 ************************************************************/

2.14HA 的切换

由于我配置的是自动切换,若 NNA 节点宕掉,NNS 节点会立即由 standby 状态切换为 active 状态。若是配置的手动状态,可以输入如下命令进行人工切换:

  1. hdfs haadmin failover forcefence forceactive nna nns

这条命令的意思是,将 nna 变成 standby,nns 变成 active。而且手动状态下需要重启服务。

2.15 效果截图

配置高可用的 Hadoop 平台

配置高可用的 Hadoop 平台

配置高可用的 Hadoop 平台

配置高可用的 Hadoop 平台

3. 总结

这篇文章就赘述到这里,若在配置过程中有什么疑问或问题,可以加入 QQ 群讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

1. 概述

在 Hadoop2.x 之后的版本,提出了解决单点问题的方案--HA(High Available 高可用)。这篇博客阐述如何搭建高可用的 HDFS 和 YARN,执行步骤如下:

  1. 创建 hadoop 用户
  2. 安装 JDK
  3. 配置 hosts
  4. 安装 SSH
  5. 关闭防火墙
  6. 修改时区
  7. ZK(安装,启动,验证)
  8. HDFS+HA 的结构图
  9. 角色分配
  10. 环境变量配置
  11. 核心文件配置
  12. slave
  13. 启动命令(hdfs 和 yarn 的相关命令)
  14. HA 的切换
  15. 效果截图

下面我们给出下载包的链接地址:

hadoop2.x 下载地址

zookeeper 下载地址

      JDK 下载地址

注:若 JDK 无法下载,请到 Oracle 的官网下载 JDK。

到这里安装包都准备好了,接下来我们开始搭建与配置。

2. 搭建

2.1 创建 Hadoop 用户

  1. useradd hadoop
  2. passwd hadoop

 然后根据提示,设置密码。接着我给 hadoop 用户设置面免密码权限,也可自行添加其他权限。

  1. chmod +w /etc/sudoers
  2. hadoop ALL=(root)NOPASSWD:ALL
  3. chmod w /etc/sudoers

2.2 安装 JDK

将下载好的安装包解压到 /usr/Java/jdk1.7,然后设置环境变量,命令如下:

  1. sudo vi /etc/profile

然后编辑配置,内容如下:

  1. export JAVA_HOME=/usr/java/jdk1.7
  2. export PATH=$PATH:$JAVA_HOME/bin

然后使环境变量立即生效,命令如下:

  1. source /etc/profile

然后验证 JDK 是否配置成功,命令如下:

  1. java version

若显示对应版本号,即表示 JDK 配置成功。否则,配置无效!

2.3 配置 hosts

集群中所有机器的 hosts 配置要要相同(推荐)。可以避免不必要的麻烦,用域名取代 IP,方便配置。配置信息如下:

  1. 10.211.55.12 nna # NameNode Active
  2. 10.211.55.13 nns # NameNode Standby
  3. 10.211.55.14 dn1 # DataNode1
  4. 10.211.55.15 dn2 # DataNode2
  5. 10.211.55.16 dn3 # DataNode3

然后用 scp 命令,将 hosts 配置分发到各个节点。命令如下:

  1. #这里以 NNS 节点为例子
  2. scp /etc/hosts hadoop@nns:/etc/

2.4 安装 SSH

输入如下命令:

  1. sshkeygen t rsa

然后一路按回车键,最后在将 id_rsa.pub 写到 authorized_keys,命令如下:

  1. cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

在 hadoop 用户下,需要给 authorized_keys 赋予 600 的权限,不然免密码登陆无效。在其他节点只需要使用 ssh-keygen –t rsa 命令,生产对应的公钥,然后将各个节点的 id_rsa.pub 追加到 nna 节点的 authorized_keys 中。最后,将 nna 节点下的 authorized_keys 文件通过 scp 命令,分发到各个节点的 ~/.ssh/ 目录下。目录如下:

  1. # 这里以 NNS 节点为例子
  2. scp ~/.ssh/authorized_keys hadoop@nns:~/.ssh/

  然后使用 ssh 命令相互登录,看是否实现了免密码登录,登录命令如下:

  1. # 这里以 nns 节点为例子
  2. ssh nns

若登录过程中木有提示需要输入密码,即表示密码配置成功。

2.5 关闭防火墙

由于 hadoop 的节点之间需要通信(RPC 机制),这样一来就需要监听对应的端口,这里我就直接将防火墙关闭了,命令如下:

  1. chkconfig iptables off

注:如果用于生产环境,直接关闭防火墙是存在安全隐患的,我们可以通过配置防火墙的过滤规则,即将 hadoop 需要监听的那些端口配置到防火墙接受规则中。关于防火墙的规则配置参见“linux 防火墙配置”,或者通知公司的运维去帮忙配置管理。

同时,也需要关闭 SELinux,可修改 /etc/selinux/config 文件,将其中的 SELINUX=enforcing 改为 SELINUX=disabled 即可。

2.6 修改时区

各个节点的时间如果不同步,会出现启动异常,或其他原因。这里将时间统一设置为 Shanghai 时区。命令如下:

  1. # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. cp: overwrite `/etc/localtime’? yes
  3. 修改为中国的东八区
  4. # vi /etc/sysconfig/clock
  5. ZONE=”Asia/Shanghai”
  6. UTC=false
  7. ARC=false

 

2.7ZK(安装,启动,验证)

2.7.1 安装

将下载好的安装包,解压到指定位置,这里为直接解压到当前位置,命令如下:

  1. tar zxvf zk-{version}.tar.gz

修改 zk 配置,将 zk 安装目录下 conf/zoo_sample.cfg 重命名 zoo.cfg,修改其中的内容:

  1. # The number of milliseconds of each tick
  2. # 服务器与客户端之间交互的基本时间单元(ms)
  3. tickTime=2000
  4.  
  5. # The number of ticks that the initial
  6. # synchronization phase can take
  7. # zookeeper 所能接受的客户端数量
  8. initLimit=10
  9.  
  10. # The number of ticks that can pass between
  11. # sending a request and getting an acknowledgement
  12. # 服务器和客户端之间请求和应答之间的时间间隔
  13. syncLimit=5
  14.  
  15. # the directory where the snapshot is stored.
  16. # do not use /tmp for storage, /tmp here is just
  17. # example sakes.
  18. # 保存 zookeeper 数据,日志的路径
  19. dataDir=/home/hadoop/data/zookeeper
  20.  
  21. # the port at which the clients will connect
  22. # 客户端与 zookeeper 相互交互的端口
  23. clientPort=2181
  24. server.1= dn1:2888:3888
  25. server.2= dn2:2888:3888
  26. server.3= dn3:2888:3888
  27.  
  28. #server.A=B:C:D
    # 其中 A 是一个数字,代表这是第几号服务器;B 是服务器的 IP 地址;
    #C 表示服务器与群集中的“领导者”交换信息的端口;当领导者失效后,D 表示用来执行选举时服务器相互通信的端口。

接下来,在配置的 dataDir 目录下创建一个 myid 文件,里面写入一个 0 -255 之间的一个随意数字,每个 zk 上这个文件的数字要是不一样的,这些数字应该是从 1 开始,依次写每个服务器。文件中序号要与 dn 节点下的 zk 配置序号一直,如:server.1=dn1:2888:3888,那么 dn1 节点下的 myid 配置文件应该写上 1。

2.7.2 启动

分别在各个 dn 节点启动 zk 进程,命令如下:

  1. bin/zkServer.sh start

然后,在各个节点输入 jps 命令,会出现如下进程:

  1. QuorumPeerMain

2.7.3 验证

上面说的输入 jps 命令,若显示对应的进程,即表示启动成功,同样我们也可以输入 zk 的状态命令查看,命令如下:

  1. bin/zkServer.sh status

会出现一个 leader 和两个 follower。

2.8HDFS+HA 的结构图

HDFS 配置 HA 的结构图如下所示:

配置高可用的 Hadoop 平台

上图大致架构包括:

1. 利用共享存储来在两个 NN 间同步 edits 信息。以前的 HDFS 是 share nothing but NN,现在 NN 又 share storage,这样其实是转移了单点故障的位置,但中高端的存储设备内部都有各种 RAID 以及冗余硬件,包括电源以及网卡等,比服务器的可靠性还是略有 提高。通过 NN 内部每次元数据变动后的 flush 操作,加上 NFS 的 close-to-open,数据的一致性得到了保证。

2. DN 同时向两个 NN 汇报块信息。这是让 Standby NN 保持集群的最新状态的必须步骤。

3. 用于监视和控制 NN 进程的 FailoverController 进程。显然,我们不能在 NN 进程内部进行心跳等信息同步,最简单的原因,一次 FullGC 就可以让 NN 挂起十几分钟,所以,必须要有一个独立的短小精悍的 watchdog 来专门负责监控。这也是一个松耦合的设计,便于扩展或更改,目前版本里是 用 ZooKeeper(简称 ZK)来做同步锁,但用户可以方便的把这个 Zookeeper FailoverController(简称 ZKFC)替换为其他的 HA 方案或 leader 选举方案。

4. 隔离(Fencing),防止脑裂,就是保证在任何时候只有一个主 NN,包括三个方面:

 共享存储 fencing,确保只有一个 NN 可以写入 edits。

 客户端 fencing,确保只有一个 NN 可以响应客户端的请求。

 DN fencing,确保只有一个 NN 向 DN 下发命令,譬如删除块,复制块等等。

2.9 角色分配

名称

Host

职责

NNA

10.211.55.12

zkfc

NNS

10.211.55.13

zkfc

DN1

10.211.55.14

zookeeper

DN2

10.211.55.15

zookeeper

DN3

10.211.55.16

zookeeper

2.10 环境变量配置

这里列出了所有的配置,后面配置其他组件,可以参考这里的配置。配置完成后,输入:. /etc/profile(或 source /etc/profile)使之立即生效。严重是否环境变量配置成功与否,输入:echo $HADOOP_HOME,若输出对应的配置路径,即可认定配置成功。

注:hadoop2.x 以后的版本 conf 文件夹改为 etc 文件夹了

配置内容如下所示:

  1. export JAVA_HOME=/usr/java/jdk1.7
  2. export HADOOP_HOME=/home/hadoop/hadoop2.6.0
  3. export ZK_HOME=/home/hadoop/zookeeper3.4.6
  4. export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOM

Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程  http://www.linuxidc.com/Linux/2015-02/113487.htm

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-02/114044p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计19020字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中