• Hadoop HA高可用环境搭建


    目录

    一:Hadoop HA 高可用

    1.1 HA 概述

    1.2 HDFS-HA 集群搭建

    1.2.1 HDFS-HA 核心问题 

    1.3 HDFS-HA 手动模式

    1.3.1 环境准备

    1.3.2 规划集群

    1.3.3 配置 HDFS-HA 集群  

    1.3.4 启动 HDFS-HA 集群

    1.4 HDFS-HA 自动模式

    1.4.1 HDFS-HA 自动故障转移工作机制

    1.4.2 HDFS-HA 自动故障转移的集群规划

    1.4.3 配置 HDFS-HA 自动故障转移

    1.5 YARN-HA 配置

    1.5.1 YARN-HA 工作机制

    1.5.2 配置 YARN-HA 集群  

    1.6 HADOOP HA 的最终规划


    一:Hadoop HA 高可用

    1.1 HA 概述

    (1)所谓 HA(High Availablity),即高可用(7*24 小时不中断服务)。

    (2)实现高可用最关键的策略是消除单点故障。HA 严格来说应该分成各个组件的 HA

    机制:HDFS 的 HA 和 YARN 的 HA。

    (3)NameNode 主要在以下两个方面影响 HDFS 集群

    ➢ NameNode 机器发生意外,如宕机,集群将无法使用,直到管理员重启

    ➢ NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用 HDFS HA 功能通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的 热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。

    1.2 HDFS-HA 集群搭建

    1.2.1 HDFS-HA 核心问题 

    1)怎么保证三台 namenode 的数据一致

    a.Fsimage:让一台 nn 生成数据,让其他机器 nn 同步

    b.Edits:需要引进新的模块 JournalNode 来保证 edtis 的文件的数据一致性

    2)怎么让同时只有一台 nn 是 active,其他所有是 standby 的

    a.手动分配 b.自动分配

    3)2nn 在 ha 架构中并不存在,定期合并 fsimage 和 edtis 的活谁来干

    由 standby 的 nn 来干

    4)如果 nn 真的发生了问题,怎么让其他的 nn 上位干活

    a.手动故障转移

    b.自动故障转移

    1.3 HDFS-HA 手动模式

    1.3.1 环境准备

    (1)修改 IP

    (2)修改主机名及主机名和 IP 地址的映射

    (3)关闭防火墙

    (4)ssh 免密登录

    (5)安装 JDK,配置环境变量等

    1.3.2 规划集群

    1.3.3 配置 HDFS-HA 集群  

    1)官方地址:http://hadoop.apache.org/

    2)在 opt 目录下创建一个 ha 文件夹

    1. [atguigu@hadoop102 ~]$ cd /opt
    2. [atguigu@hadoop102 opt]$ sudo mkdir ha
    3. [atguigu@hadoop102 opt]$ sudo chown atguigu:atguigu /opt/ha

    3)将/opt/module/下的 hadoop-3.1.3 拷贝到/opt/ha 目录下(记得删除 data 和 log 目录)

    [atguigu@hadoop102 opt]$ cp -r /opt/module/hadoop-3.1.3 /opt/ha/ 
    

    4)配置 core-site.xml(注意:这里要把以前配置过的信息全部删除)

    1. <configuration>
    2. <!-- 把多个 NameNode 的地址组装成一个集群 mycluster -->
    3. <property>
    4. <name>fs.defaultFS</name> <value>hdfs://mycluster</value>
    5. </property>
    6. <!-- 指定 hadoop 运行时产生文件的存储目录 -->
    7. <property>
    8. <name>hadoop.tmp.dir</name>
    9. <value>/opt/ha/hadoop-3.1.3/data</value>
    10. </property>
    11. </configuration>

    5)配置 hdfs-site.xml(注意:这里要把以前配置过的信息全部删除)

    1. <configuration>
    2. <!-- NameNode 数据存储目录 -->
    3. <property>
    4. <name>dfs.namenode.name.dir</name>
    5. <value>file://${hadoop.tmp.dir}/name</value>
    6. </property>
    7. <!-- DataNode 数据存储目录 -->
    8. <property>
    9. <name>dfs.datanode.data.dir</name>
    10. <value>file://${hadoop.tmp.dir}/data</value>
    11. </property>
    12. <!-- JournalNode 数据存储目录 -->
    13. <property>
    14. <name>dfs.journalnode.edits.dir</name>
    15. <value>${hadoop.tmp.dir}/jn</value>
    16. </property>
    17. <!-- 完全分布式集群名称 -->
    18. <property>
    19. <name>dfs.nameservices</name>
    20. <value>mycluster</value>
    21. </property>
    22. <!-- 集群中 NameNode 节点都有哪些 -->
    23. <property>
    24. <name>dfs.ha.namenodes.mycluster</name>
    25. <value>nn1,nn2,nn3</value>
    26. </property>
    27. <!-- NameNode 的 RPC 通信地址 -->
    28. <property>
    29. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    30. <value>hadoop102:8020</value>
    31. </property>
    32. <property>
    33. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    34. <value>hadoop103:8020</value>
    35. </property> <property>
    36. <name>dfs.namenode.rpc-address.mycluster.nn3</name>
    37. <value>hadoop104:8020</value>
    38. </property>
    39. <!-- NameNode 的 http 通信地址 -->
    40. <property>
    41. <name>dfs.namenode.http-address.mycluster.nn1</name>
    42. <value>hadoop102:9870</value>
    43. </property>
    44. <property>
    45. <name>dfs.namenode.http-address.mycluster.nn2</name>
    46. <value>hadoop103:9870</value>
    47. </property>
    48. <property>
    49. <name>dfs.namenode.http-address.mycluster.nn3</name>
    50. <value>hadoop104:9870</value>
    51. </property>
    52. <!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
    53. <property>
    54. <name>dfs.namenode.shared.edits.dir</name>
    55. <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/myclus
    56. ter</value>
    57. </property>
    58. <!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
    59. <property>
    60. <name>dfs.client.failover.proxy.provider.mycluster</name>
    61. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyP
    62. rovider</value>
    63. </property>
    64. <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
    65. <property>
    66. <name>dfs.ha.fencing.methods</name>
    67. <value>sshfence</value>
    68. </property>
    69. <!-- 使用隔离机制时需要 ssh 秘钥登录-->
    70. <property>
    71. <name>dfs.ha.fencing.ssh.private-key-files</name>
    72. <value>/home/atguigu/.ssh/id_rsa</value>
    73. </property>
    74. </configuration>

    6)分发配置好的 hadoop 环境到其他节点

    1.3.4 启动 HDFS-HA 集群

    1)将 HADOOP_HOME 环境变量更改到 HA 目录(三台机器)

    [atguigu@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh 
    
    1. 将 HADOOP_HOME 部分改为如下
    2. #HADOOP_HOME
    3. export HADOOP_HOME=/opt/ha/hadoop-3.1.3
    4. export PATH=$PATH:$HADOOP_HOME/bin
    5. export PATH=$PATH:$HADOOP_HOME/sbin

    去三台机器上 source 环境变量

    [atguigu@hadoop102 ~]$source /etc/profile

    2)在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务

    1. [atguigu@hadoop102 ~]$ hdfs --daemon start journalnode
    2. [atguigu@hadoop103 ~]$ hdfs --daemon start journalnode
    3. [atguigu@hadoop104 ~]$ hdfs --daemon start journalnode

    3)在[nn1]上,对其进行格式化,并启动

    1. [atguigu@hadoop102 ~]$ hdfs namenode -format
    2. [atguigu@hadoop102 ~]$ hdfs --daemon start namenode

    4)在[nn2]和[nn3]上,同步 nn1 的元数据信息

    1. [atguigu@hadoop103 ~]$ hdfs namenode -bootstrapStandby
    2. [atguigu@hadoop104 ~]$ hdfs namenode -bootstrapStandby

    5)启动[nn2]和[nn3]

    1. [atguigu@hadoop103 ~]$ hdfs --daemon start namenode
    2. [atguigu@hadoop104 ~]$ hdfs --daemon start namenode

    6)查看 web 页面显示(hadoop102:9870)

    7)在所有节点上,启动 datanode

    1. [atguigu@hadoop102 ~]$ hdfs --daemon start datanode
    2. [atguigu@hadoop103 ~]$ hdfs --daemon start datanode
    3. [atguigu@hadoop104 ~]$ hdfs --daemon start datanode

    8)将[nn1]切换为 Active

    [atguigu@hadoop102 ~]$ hdfs haadmin -transitionToActive nn1 

    9)查看是否 Active

    [atguigu@hadoop102 ~]$ hdfs haadmin -getServiceState nn1 
    

    1.4 HDFS-HA 自动模式

    1.4.1 HDFS-HA 自动故障转移工作机制

    自动故障转移为 HDFS 部署增加了两个新组件:ZooKeeper 和 ZKFailoverController

    (ZKFC)进程,如图所示。ZooKeeper 是维护少量协调数据,通知客户端这些数据的改变 和监视客户端故障的高可用服务。

    HDFS-HA故障转移机制 :

     

     (1)假如标记为active的namenode没有和其他的namenode连接成功(假死),或者标记为active已经终止

    (2)标记为active的namenode的对应的Zkfc则会检测到假死

    (3)检测都假死后,则会通知另一台namenode节点的Zkfc

    (4)Zkfc会强行杀死namenode,防止脑裂,ssh -9 namenode进程号

    (5)如果ssh补刀失败则调用用户自定义脚本程序

    (6)获取命令运行结果

    (7)激活本台namenode,切换为Active


    1.4.2 HDFS-HA 自动故障转移的集群规划

    1.4.3 配置 HDFS-HA 自动故障转移

     1)具体配置

    (1)在 hdfs-site.xml 中增加

    1. <!-- 启用 nn 故障自动转移 -->
    2. <property>
    3. <name>dfs.ha.automatic-failover.enabled</name>
    4. <value>true</value>
    5. </property>

    (2)在 core-site.xml 文件中增加

    1. <!-- 指定 zkfc 要连接的 zkServer 地址 -->
    2. <property>
    3. <name>ha.zookeeper.quorum</name>
    4. <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
    5. </property>

    (3)修改后分发配置文件

    1. [atguigu@hadoop102 etc]$ pwd
    2. /opt/ha/hadoop-3.1.3/etc
    3. [atguigu@hadoop102 etc]$ xsync hadoop/

    2)启动

    (1)关闭所有 HDFS 服务:

    [atguigu@hadoop102 ~]$ stop-dfs.sh 
    

    (2)启动 Zookeeper 集群:

    1. [atguigu@hadoop102 ~]$ zkServer.sh start
    2. [atguigu@hadoop103 ~]$ zkServer.sh start
    3. [atguigu@hadoop104 ~]$ zkServer.sh start

    (3)启动 Zookeeper 以后,然后再初始化 HA 在 Zookeeper 中状态:

    [atguigu@hadoop102 ~]$ hdfs zkfc -formatZK 
    

    (4)启动 HDFS 服务:

    [atguigu@hadoop102 ~]$ start-dfs.sh 
    

    (5)可以去 zkCli.sh 客户端查看 Namenode 选举锁节点内容:

    1. [zk: localhost:2181(CONNECTED) 7] get -s
    2. /hadoop-ha/mycluster/ActiveStandbyElectorLock

    3)验证

    (1)将 Active NameNode 进程 kill,查看网页端三台 Namenode 的状态变化

    [atguigu@hadoop102 ~]$ kill -9 namenode 的进程 id 
    

    1.5 YARN-HA 配置

    1.5.1 YARN-HA 工作机制

    YARN-HA 工作机制

    1.5.2 配置 YARN-HA 集群  

    1)环境准备

    (1)修改 IP

    (2)修改主机名及主机名和 IP 地址的映射

    (3)关闭防火墙

    (4)ssh 免密登录

    (5)安装 JDK,配置环境变量等

    (6)配置 Zookeeper 集群

    2)规划集群

    3)核心问题  

    a .如果当前 active rm 挂了,其他 rm 怎么将其他 standby rm 上位

    核心原理跟 hdfs 一样,利用了 zk 的临时节点

    b. 当前 rm 上有很多的计算程序在等待运行,其他的 rm 怎么将这些程序接手过来接着跑

    rm 会将当前的所有计算程序的状态存储在 zk 中,其他 rm 上位后会去读取,然后接 着跑

    4)具体配置

    (1)yarn-site.xml

    1. <configuration>
    2. <property>
    3. <name>yarn.nodemanager.aux-services</name>
    4. <value>mapreduce_shuffle</value>
    5. </property>
    6. <!-- 启用 resourcemanager ha -->
    7. <property>
    8. <name>yarn.resourcemanager.ha.enabled</name>
    9. <value>true</value>
    10. </property>
    11. <!-- 声明两台 resourcemanager 的地址 -->
    12. <property>
    13. <name>yarn.resourcemanager.cluster-id</name>
    14. <value>cluster-yarn1</value>
    15. </property>
    16. <!--指定 resourcemanager 的逻辑列表-->
    17. <property>
    18. <name>yarn.resourcemanager.ha.rm-ids</name>
    19. <value>rm1,rm2,rm3</value>
    20. </property>
    21. <!-- ========== rm1 的配置 ========== -->
    22. <!-- 指定 rm1 的主机名 -->
    23. <property>
    24. <name>yarn.resourcemanager.hostname.rm1</name>
    25. <value>hadoop102</value>
    26. </property>
    27. <!-- 指定 rm1 的 web 端地址 -->
    28. <property>
    29. <name>yarn.resourcemanager.webapp.address.rm1</name>
    30. <value>hadoop102:8088</value>
    31. </property>
    32. <!-- 指定 rm1 的内部通信地址 -->
    33. <property>
    34. <name>yarn.resourcemanager.address.rm1</name>
    35. <value>hadoop102:8032</value>
    36. </property>
    37. <!-- 指定 AM 向 rm1 申请资源的地址 -->
    38. <property> <name>yarn.resourcemanager.scheduler.address.rm1</name>
    39. <value>hadoop102:8030</value>
    40. </property>
    41. <!-- 指定供 NM 连接的地址 -->
    42. <property>
    43. <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
    44. <value>hadoop102:8031</value>
    45. </property>
    46. <!-- ========== rm2 的配置 ========== -->
    47. <!-- 指定 rm2 的主机名 -->
    48. <property>
    49. <name>yarn.resourcemanager.hostname.rm2</name>
    50. <value>hadoop103</value>
    51. </property>
    52. <property>
    53. <name>yarn.resourcemanager.webapp.address.rm2</name>
    54. <value>hadoop103:8088</value>
    55. </property>
    56. <property>
    57. <name>yarn.resourcemanager.address.rm2</name>
    58. <value>hadoop103:8032</value>
    59. </property>
    60. <property>
    61. <name>yarn.resourcemanager.scheduler.address.rm2</name>
    62. <value>hadoop103:8030</value>
    63. </property>
    64. <property>
    65. <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
    66. <value>hadoop103:8031</value>
    67. </property>
    68. <!-- ========== rm3 的配置 ========== -->
    69. <!-- 指定 rm1 的主机名 -->
    70. <property>
    71. <name>yarn.resourcemanager.hostname.rm3</name>
    72. <value>hadoop104</value>
    73. </property>
    74. <!-- 指定 rm1 的 web 端地址 -->
    75. <property>
    76. <name>yarn.resourcemanager.webapp.address.rm3</name>
    77. <value>hadoop104:8088</value>
    78. </property>
    79. <!-- 指定 rm1 的内部通信地址 -->
    80. <property>
    81. <name>yarn.resourcemanager.address.rm3</name> <value>hadoop104:8032</value>
    82. </property>
    83. <!-- 指定 AM 向 rm1 申请资源的地址 -->
    84. <property>
    85. <name>yarn.resourcemanager.scheduler.address.rm3</name>
    86. <value>hadoop104:8030</value>
    87. </property>
    88. <!-- 指定供 NM 连接的地址 -->
    89. <property>
    90. <name>yarn.resourcemanager.resource-tracker.address.rm3</name>
    91. <value>hadoop104:8031</value>
    92. </property>
    93. <!-- 指定 zookeeper 集群的地址 -->
    94. <property>
    95. <name>yarn.resourcemanager.zk-address</name>
    96. <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
    97. </property>
    98. <!-- 启用自动恢复 -->
    99. <property>
    100. <name>yarn.resourcemanager.recovery.enabled</name>
    101. <value>true</value>
    102. </property>
    103. <!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
    104. <property>
    105. <name>yarn.resourcemanager.store.class</name>
    106. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateSt
    107. ore</value>
    108. </property>
    109. <!-- 环境变量的继承 -->
    110. <property>
    111. <name>yarn.nodemanager.env-whitelist</name>
    112. <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS
    113. SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    114. </property>
    115. </configuration>

    (2)同步更新其他节点的配置信息,分发配置文件

    [atguigu@hadoop102 etc]$ xsync hadoop/ 

    4)启动 YARN

    (1)在 hadoop102 或者 hadoop103 中执行:

    [atguigu@hadoop102 ~]$ start-yarn.sh 

    (2)查看服务状态

    [atguigu@hadoop102 ~]$ yarn rmadmin -getServiceState rm1 
    

    (3)可以去 zkCli.sh 客户端查看 ResourceManager 选举锁节点内容:

    1. [atguigu@hadoop102 ~]$ zkCli.sh
    2. [zk: localhost:2181(CONNECTED) 16] get -s
    3. /yarn-leader-election/cluster-yarn1/ActiveStandbyElectorLock

    (4)web 端查看 hadoop102:8088 和 hadoop103:8088 的 YARN 的状态

    1.6 HADOOP HA 的最终规划

    将整个 ha 搭建完成后,集群将形成以下模样

     

  • 相关阅读:
    MATLAB算法实战应用案例精讲-【智能优化算法】差分进化算法-DE(附MATLAB、Java、Python和C++代码)
    Redis订阅和发布
    ArcGIS Pro SDK (四)框架 2
    【Java】Java 代码注释是代码逻辑的灵魂
    数据挖掘:航空公司的客户价值分析
    前端学习笔记——jQuery
    Java 多线程共享模型之管程(上)
    新发现,新挑战,技术出海的机遇与挑战丨PingCAP DevCon 2022 出海专场
    rabbitMq路由键介绍
    Java刷题day37
  • 原文地址:https://blog.csdn.net/JiaXingNashishua/article/details/126754638