hadoop HA (高可用 high available)的搭建

灰太狼 2024-04-18 16:36 203阅读 0赞

hadoop HA 的搭建

    • hadoop HA 需求来源
        • 为什么要搭建hadoop HA?
        • 如何实现高可用?
        • 如何写入zookeeper数据?
    • hadoop HA 的搭建:
        • 搭建准备
        • 开始搭建
        • 启动集群

hadoop HA 需求来源

为什么要搭建hadoop HA?

在hadoop 2.0之前,整个hdfs集群中只有一个nn,所以一旦nn节点宕机,则整个集群无法使用。这种现象称为单点故障。
解决办法: 设置2个namenode
在hadoop2.0之前,一个集群只能有一个nn,2.0可以设计2个nn,3.0可以支持多个nn。

在hadoop 2.0里,设计的2个nn,在同一时间,只有一个namenode对外提供服务,将这个称为 active namenode;另一个处于热备份状态,叫 standby namenode。一旦active namenode 宕机的时候,standby namenode 就立即无缝切换为 active namenode。 对于客户端来说,觉得集群是24小时都处于对外服务状态。 不过,宕机的namenode即使复活了,也只能做 standby 了。

Active namenode:

只能有一个,正在活跃的,处理dn,客户端等。

Standby namenode:

Active nomenode的热备。
hadoop HA 原理

如何实现高可用?

要想实现高可用,必须保证:

  • 1)active 和 standby 的元数据,必须实时保持一致性
    namenode的元数据,核心的有两部分:

    • 1.1)fsimage:磁盘元数据文件 (初始化的fsimage文件 (hdfs格式化时自己生成) + edits 定期合并而来)
      所以 active 和 standby 要保持一致,只需要保证初始化的 fsimage 和 edits 保持一致即可。

      • 1.1.1)初始化的 fsimage 文件保持一致
        将这个初始化的 fsimage 文件发送给另一个namenode就可以了。
      • 1.1.2)保证 edits 文件保持一致
        edits文件是持续性产生的,所以保证active 和 standby 的一致性,核心是保证active 和 standby 的 edits 文件实时一致即可。 active 将 edits 文件 存入 QJM 平台,standby 会时刻监听 QJM 平台 edits 文件的更新,一旦有更新,standby 会立即将更新的 edits 文件拉取到自己的节点。
    • 1.2)edits:编辑日志文件
  • 2)active 和 standby 的状态信息一致,standby 实时感知active的存活状态
    借助于zookeeper,active可以将状态信息写入zookeeper中,standby监听zookeeper对应的状态信息节点,一旦发现状态信息改变了,立即将自己的状态切换为active,同时修改zookeeper中的状态信息。
    切换过程中,为了避免发生脑裂(集群中有两个active namenode),standby在切换为active之前,会向active发送一个shell命令(kill -9,init 0),确保原来的active是宕机的。

如何写入zookeeper数据?

  • active的namenode通过zkfc(zookeeper failoverControler)将数据写入zookeeper中。
  • standby也通过zkfc获取zookeeper中active namenode的状态信息。

注意: zkfc是hadoop自带的,和namenode安装在同一个节点

hadoop HA 的搭建:

搭建准备

1)依赖环境

  1. jdk
  2. linux 用户 ip hosts 免密 用户设置。。。 9

2)集群规划(重点)
hdfs规划如下:

  1. namenode--2
  2. zkfc--2
  3. datanode--3
  4. jounalnode --3
  5. yarn resourcemanager --2
  6. nodemanager--3

进程规划如下:




























































项目 hadoop01进程 hadoop02进程 hadoop03进程
hdfs namenode namenode
hdfs zkfc zkfc
hdfs datanode datanode datanode
hdfs jounalnode jounalnode jounalnode
yarn resourcemanager resourcemanager
yarn nodemanager nodemanager nodemanager
zookeeper QuorumPeerMain QuorumPeerMain QuorumPeerMain
总计 6个进程 7个进程 5个进程

开始搭建

1)上传
2)解压

  1. tar -xvzf hadoop-2.7.7.tar.gz

3)配置环境变量

  1. export HADOOP_HOME=/home/hadoop/app/hadoop-2.7.7
  2. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  3. source /etc/profile
  4. hadoop version

4)修改hadoop的配置文件

  1. /home/hadoop/app/hadoop-2.7.7/etc/hadoop 下面
  2. 1.) hadoop-env.sh
  3. export JAVA_HOME=/home/hadoop/app/jdk1.8.0_73
  4. 2.) slaves 从节点 datanode|nodemanager
  5. hadoop01
  6. hadoop02
  7. hadoop03
  8. 3.) core-site.xml
  9. hadoop fs -ls /
  10. hadoop fs -ls hdfs://hadoop01:9000/
  11. <!-- 指定hdfs的访问的url入口 完全分布式 hdfs://hadoop01:9000 高可用中 给的是一个nameservice bd1904 组名 -->
  12. <property>
  13. <name>fs.defaultFS</name>
  14. <value>hdfs://bd1904/</value>
  15. </property>
  16. <!-- 指定 hadoop 工作目录 namenode datanode -->
  17. <property>
  18. <name>hadoop.tmp.dir</name>
  19. <value>/home/hadoop/data/hadoopdata/</value>
  20. </property>
  21. <!-- 指定 zookeeper 集群访问地址 -->
  22. <property>
  23. <name>ha.zookeeper.quorum</name>
  24. <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
  25. </property>
  26. 4.hdfs-site.xml
  27. <!-- 指定副本数 -->
  28. <property>
  29. <name>dfs.replication</name>
  30. <value>2</value>
  31. </property>
  32. <!--指定 hdfs nameservice bd1904,需要和 core-site.xml 中保持一致-->
  33. <property>
  34. <name>dfs.nameservices</name>
  35. <value>bd1904</value>
  36. </property>
  37. <!-- bd1904 下面有两个 NameNode,分别是 nn1nn2 -->
  38. <property>
  39. <name>dfs.ha.namenodes.bd1904</name>
  40. <value>nn1,nn2</value>
  41. </property>
  42. <!-- nn1 RPC 通信地址 -->
  43. <property>
  44. <name>dfs.namenode.rpc-address.bd1904.nn1</name>
  45. <value>hadoop01:8020</value>
  46. </property>
  47. <!-- nn1 http 通信地址 -->
  48. <property>
  49. <name>dfs.namenode.http-address.bd1904.nn1</name>
  50. <value>hadoop01:50070</value>
  51. </property>
  52. <!-- nn2 RPC 通信地址 -->
  53. <property>
  54. <name>dfs.namenode.rpc-address.bd1904.nn2</name>
  55. <value>hadoop02:8020</value>
  56. </property>
  57. <!-- nn2 http 通信地址 -->
  58. <property>
  59. <name>dfs.namenode.http-address.bd1904.nn2</name>
  60. <value>hadoop02:50070</value>
  61. </property>
  62. <!-- 指定 NameNode edits 元数据在 JournalNode 上的存放位置 qjm节点 -->
  63. <property>
  64. <name>dfs.namenode.shared.edits.dir</name>
  65. <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/bd1904</value>
  66. </property>
  67. <!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
  68. <property>
  69. <name>dfs.journalnode.edits.dir</name>
  70. <value>/home/hadoop/data/hadoopdata/journaldata</value>
  71. </property>
  72. <!-- 开启 NameNode 失败自动切换 -->
  73. <property>
  74. <name>dfs.ha.automatic-failover.enabled</name>
  75. <value>true</value>
  76. </property>
  77. <!-- 配置失败自动切换实现方式 -->
  78. <!-- 此处配置在安装的时候切记检查不要换行-->
  79. <property>
  80. <name>dfs.client.failover.proxy.provider.bd1904</name>
  81. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  82. </property>
  83. <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
  84. <property>
  85. <name>dfs.ha.fencing.methods</name>
  86. <value>
  87. sshfence
  88. shell(/bin/true)
  89. </value>
  90. </property>
  91. <!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
  92. <property>
  93. <name>dfs.ha.fencing.ssh.private-key-files</name>
  94. <value>/home/hadoop/.ssh/id_rsa</value>
  95. </property>
  96. <!-- 配置 sshfence 隔离机制超时时间 -->
  97. <property>
  98. <name>dfs.ha.fencing.ssh.connect-timeout</name>
  99. <value>30000</value>
  100. </property>
  101. 5.mapred-site.xml
  102. mv mapred-site.xml.template mapred-site.xml
  103. <!-- 指定 mr 框架为 yarn 方式 -->
  104. <property>
  105. <name>mapreduce.framework.name</name>
  106. <value>yarn</value>
  107. </property>
  108. <!-- 设置 mapreduce 的历史服务器地址和端口号 -->
  109. <property>
  110. <name>mapreduce.jobhistory.address</name>
  111. <value>hadoop03:10020</value>
  112. </property>
  113. <!-- mapreduce 历史服务器的 web 访问地址 -->
  114. <property>
  115. <name>mapreduce.jobhistory.webapp.address</name>
  116. <value>hadoop03:19888</value>
  117. </property>
  118. 6.yarn-site.xml
  119. <!-- 开启 RM 高可用 -->
  120. <property>
  121. <name>yarn.resourcemanager.ha.enabled</name>
  122. <value>true</value>
  123. </property>
  124. <!-- 指定 RM cluster id rm 组名-->
  125. <property>
  126. <name>yarn.resourcemanager.cluster-id</name>
  127. <value>yarnbd1904</value>
  128. </property>
  129. <!-- 指定 RM 的名字 -->
  130. <property>
  131. <name>yarn.resourcemanager.ha.rm-ids</name>
  132. <value>rm1,rm2</value>
  133. </property>
  134. <!-- 分别指定 RM 的地址 -->
  135. <property>
  136. <name>yarn.resourcemanager.hostname.rm1</name>
  137. <value>hadoop02</value>
  138. </property>
  139. <property>
  140. <name>yarn.resourcemanager.hostname.rm2</name>
  141. <value>hadoop03</value>
  142. </property>
  143. <!-- 指定 zk 集群地址 -->
  144. <property>
  145. <name>yarn.resourcemanager.zk-address</name>
  146. <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
  147. </property>
  148. <!-- 要运行 MapReduce 程序必须配置的附属服务 -->
  149. <property>
  150. <name>yarn.nodemanager.aux-services</name>
  151. <value>mapreduce_shuffle</value>
  152. </property>
  153. <!-- 开启 YARN 集群的日志聚合功能 -->
  154. <property>
  155. <name>yarn.log-aggregation-enable</name>
  156. <value>true</value>
  157. </property>
  158. <!-- YARN 集群的聚合日志最长保留时长 -->
  159. <property>
  160. <name>yarn.log-aggregation.retain-seconds</name>
  161. <value>86400</value>
  162. </property>
  163. <!-- 启用自动恢复 -->
  164. <property>
  165. <name>yarn.resourcemanager.recovery.enabled</name>
  166. <value>true</value>
  167. </property>
  168. <!-- 制定 resourcemanager 的状态信息存储在 zookeeper 集群上-->
  169. <property>
  170. <name>yarn.resourcemanager.store.class</name>
  171. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  172. </property>

5)远程发送

  1. scp -r hadoop-2.7.7 hadoop01:/home/hadoop/app/
  2. scp -r hadoop-2.7.7 hadoop03:/home/hadoop/app/
  3. scp -r hadoop-2.7.7 hadoop01:/home/jacob/app/
  4. sudo scp /etc/profile hadoop01:/etc
  5. sudo scp /etc/profile hadoop03:/etc
  6. source /etc/profile

启动集群

6)启动集群(以下步骤 严格按照顺序执行)

  1. 1)启动zk
  2. zkServer.sh start
  3. 2)启动qjm平台 启动journalnode进程
  4. 3个节点的分别执行
  5. hadoop-daemon.sh start journalnode
  6. 3)格式化hdfs namenode
  7. 在其中一个namenode节点执行 hadoop01
  8. hadoop namenode -format
  9. 格式化元数据磁盘目录
  10. 4)将hadoop01上的namenode的相关元数据信息 远程发送到另一个namenode节点
  11. scp -r /home/hadoop/data/hadoopdata/* hadoop02:/home/hadoop/data/hadoopdata/
  12. scp -r /home/jacob/data/hadoopdata/* hadoop02:/home/jacob/data/hadoopdata/
  13. 5)初始化zkfc (在zkfc的一个节点执行)
  14. hdfs zkfc -formatZK
  15. 看到 Successfully created /hadoop-ha/bd1904 in ZK. 这句话时表示成功
  16. 目的是 在zk中创建对应的存储namenode的状态信息的节点
  17. 6)启动
  18. start-dfs.sh 任意节点启动
  19. start-yarn.sh 在yarn的其中一个主节点启动
  20. 另一个yarn的主节点单独启动 resourcemanager
  21. 命令:yarn-daemon.sh start resourcemanager
  22. 也可以使用图形界面查看,在浏览器中查看:
  23. 查看namenode状态:hadoop01:50070 或 hadoop02:50070
  24. 查看resourcemanager的状态:hadoop02:8088 或 hadoop03:8088

关闭集群的顺序:

  1. 1)关闭hdfs
  2. stop-dfs.sh 任意节点
  3. 2)关闭yarn
  4. stop-yarn.sh yarn的其中一个主节点
  5. yarn-daemon.sh stop resourcemanager
  6. 3)关闭zk
  7. zkServer.sh stop 3个节点的分别执行

集群再次启动顺序

  1. 1)启动zk
  2. 2)启动hdfs
  3. 3)启动yarn

发表评论

表情:
评论列表 (有 0 条评论,203人围观)

还没有评论,来说两句吧...

相关阅读