[关闭]
@zhangyy 2020-07-22T14:40:22.000000Z 字数 9190 阅读 112

部署 完全分布式高可用 Hadoop hdfs HA + yarn HA

大数据运维专栏


  • 一:hadoop HDFS HA 与 yarn HA 的 概述
  • 二:部署环境概述
  • 三:部署zookeeper
  • 四:部署HDFS HA 与 yarn HA
  • 五:关于 HA 的测试

一:hadoop HDFS HA 与 yarn HA 的 概述

1.1 HA 的概述

  1. HA概述
  2. 1)所谓HAHigh Available),即高可用(7*24小时不中断服务)。
  3. 2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFSHAYARNHA
  4. 3Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。
  5. 4NameNode主要在以下两个方面影响HDFS集群:
  6. NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启。
  7. NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。
  8. HDFS HA功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

1.2 HDFS-HA 的工作机制

  1. HDFS-HA工作机制
  2. 通过双NameNode消除单点故障。
  3. HDFS-HA工作要点
  4. 1、元数据管理方式需要改变
  5. 内存中各自保存一份元数据;
  6. Edits日志只有Active状态的NameNode节点可以做写操作;
  7. 两个NameNode都可以读取Edits
  8. 共享的Edits放在一个共享存储中管理(qjournalNFS两个主流实现)。
  9. 2、需要一个状态管理功能模块
  10. 实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split(脑裂)现象的发生。
  11. 3、必须保证两个NameNode之间能够ssh无密码登录。
  12. 4、隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务。

1.3 HDFS-HA手动故障转移工作机制

图片.png-262.7kB


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

图片.png-288.6kB

二: 部署环境概述

2.1:所需安装配置包

  1. 1. 系统:CentOS 7.5 X64
  2. 2. 软件:Hadoop-3.2.1.tar.gz
  3. apache-zookeeper-3.6.1-bin.tar.gz
  4. jdk-8u181-linux-x64.rpm
  5. 将所有软件安装上传到/software下面
  6. 3. 系统关闭SELINUX 与清空iptables 防火墙规则
  7. 4. 系统配置好 时间同步服务器
  8. ntp1.aliyun.com

图片.png-16.1kB

图片.png-19.3kB

图片.png-25.2kB

三:部署zookeeper

  1. fat01.flyfish.com 节点操作
  2. tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz
  3. mv apache-zookeeper-3.6.1-bin /opt/bigdata/zookeeper
  4. cd /opt/bigdata/zookeeper/conf
  5. cp -p zoo_sample.cfg zoo.cfg
  6. vim zoo.cfg
  7. -----
  8. dataDir=/opt/bigdata/zookeeper/data/
  9. server.1=fat01.flyfish.com:2888:3888
  10. server.2=fat02.flyfish.com:2888:3888
  11. server.3=fat03.flyfish.com:2888:3888
  12. ----
  13. mkdir -p /opt/bigdata/zookeeper/data/
  14. echo "1" > /opt/bigdata/zookeeper/data/myid
  15. 打包zookeeper 目录
  16. cd /opt/bigdata/
  17. tar -zcvf zookeeper.tar.gz zookeeper
  18. scp zookeeper.tar.gz root@192.168.11.195:/opt/bigdata/
  19. scp zookeeper.tar.gz root@192.168.11.197:/opt/bigdata/

  1. fat02.flyfish.com 节点操作
  2. cd /opt/bigdata/
  3. tar -zxvf zookeeper.tar.gz
  4. echo 2 > /opt/bigdata/zookeeper/data/myid

  1. fat03.flyfish.com 节点操作
  2. cd /opt/bigdata/
  3. tar -zxvf zookeeper.tar.gz
  4. echo 3 > /opt/bigdata/zookeeper/data/myid

  1. 启动所有节点的zookeeper
  2. cd /opt/bigdata/zookeeper/bin
  3. ./zkstart.sh

图片.png-37.7kB

图片.png-31.4kB

图片.png-12.9kB


四:部署HDFS HA 与 yarn HA

4.1 部署解压Hadoop

  1. tar zxvf hadoop-3.2.1.tar.gz
  2. mv hadoop-3.2.1 /opt/bigdata/hadoop/

4.2 编辑Hadoop-env.sh 配置文件

  1. vim hadoop-env.sh
  2. ---
  3. export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
  4. export HADOOP_PID_DIR=/opt/bigdata/hadoop/data/tmp
  5. export HADOOP_SECURE_DN_PID_DIR=/opt/bigdata/hadoop/data/tmp
  6. export HDFS_NAMENODE_USER="root"
  7. export HDFS_DATANODE_USER="root"
  8. export HDFS_ZKFC_USER="root"
  9. export HDFS_JOURNALNODE_USER="root"
  10. ----

图片.png-12.7kB

  1. vim mapred-env.sh
  2. 增加jdk 的环境
  3. export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
  4. export HADOOP_MAPRED_PID_DIR=/opt/bigdata/hadoop/data/tmp
  5. -----
  6. vim yarn-env.sh
  7. export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
  8. export YARN_RESOURCEMANAGER_USER=root
  9. export YARN_NODEMANAGER_USER=root

图片.png-6.7kB

图片.png-5.8kB

4.3 编辑core-site.xml 文件

  1. cd /opt/bigdata/hadoop/etc/hadoop
  2. vim core-site.xml
  3. ---
  4. <configuration>
  5. <property>
  6. <name>fs.defaultFS</name>
  7. <value>hdfs://myNameService1</value>
  8. </property>
  9. <property>
  10. <name>hadoop.tmp.dir</name>
  11. <value>file:/opt/bigdata/hadoop/data/tmp</value>
  12. <description>Abase for other temporary directories.</description>
  13. </property>
  14. <!-- 指定zookeeper地址 -->
  15. <property>
  16. <name>ha.zookeeper.quorum</name>
  17. <value>fat01.flyfish.com:2181,fat02.flyfish.com:2181,fat03.flyfish.com:2181</value>
  18. </property>
  19. </configuration>
  20. ----

4.4 编辑 hdfs-site.xml

  1. vim hdfs-site.xml
  2. ----
  3. <configuration>
  4. <!--指定hdfsnameservicemyNameService1,需要和core-site.xml中的保持一致 -->
  5. <property>
  6. <name>dfs.nameservices</name>
  7. <value>myNameService1</value>
  8. </property>
  9. <!-- myNameService1下面有两个NameNode,分别是nn1nn2 -->
  10. <property>
  11. <name>dfs.ha.namenodes.myNameService1</name>
  12. <value>nn1,nn2</value>
  13. </property>
  14. <!-- nn1RPC通信地址 -->
  15. <property>
  16. <name>dfs.namenode.rpc-address.myNameService1.nn1</name>
  17. <value>fat01.flyfish.com:9000</value>
  18. </property>
  19. <!-- nn1http通信地址 -->
  20. <property>
  21. <name>dfs.namenode.http-address.myNameService1.nn1</name>
  22. <value>fat01.flyfish.com:50070</value>
  23. </property>
  24. <!-- nn2RPC通信地址 -->
  25. <property>
  26. <name>dfs.namenode.rpc-address.myNameService1.nn2</name>
  27. <value>fat02.flyfish.com:9000</value>
  28. </property>
  29. <!-- nn2http通信地址 -->
  30. <property>
  31. <name>dfs.namenode.http-address.myNameService1.nn2</name>
  32. <value>fat02.flyfish.com:50070</value>
  33. </property>
  34. <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
  35. <property>
  36. <name>dfs.namenode.shared.edits.dir</name>
  37. <value>qjournal://fat01.flyfish.com:8485;fat02.flyfish.com:8485;fat03.flyfish.com:8485/myNameService1</value>
  38. </property>
  39. <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
  40. <property>
  41. <name>dfs.journalnode.edits.dir</name>
  42. <value>/opt/bigdata/hadoop/data/jn</value>
  43. </property>
  44. <!-- 开启NameNode失败自动切换 -->
  45. <property>
  46. <name>dfs.ha.automatic-failover.enabled</name>
  47. <value>true</value>
  48. </property>
  49. <!-- 配置失败自动切换实现方式 -->
  50. <property>
  51. <name>dfs.client.failover.proxy.provider.myNameService1</name>
  52. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  53. </property>
  54. <!-- 配置隔离机制方法,Failover后防止停掉的Namenode启动,造成两个服务,多个机制用换行分割,即每个机制暂用一行-->
  55. <property>
  56. <name>dfs.ha.fencing.methods</name>
  57. <value>
  58. sshfence
  59. shell(/bin/true)
  60. </value>
  61. </property>
  62. <!-- 使用sshfence隔离机制时需要ssh免登陆,注意换成自己的用户名 -->
  63. <property>
  64. <name>dfs.ha.fencing.ssh.private-key-files</name>
  65. <value>/root/.ssh/id_rsa</value>
  66. </property>
  67. <!-- 配置sshfence隔离机制超时时间 -->
  68. <property>
  69. <name>dfs.ha.fencing.ssh.connect-timeout</name>
  70. <value>30000</value>
  71. </property>
  72. <property>
  73. <name>dfs.replication</name>
  74. <value>2</value>
  75. </property>
  76. <property>
  77. <name>dfs.namenode.name.dir</name>
  78. <value>file:/opt/bigdata/hadoop/data/tmp/dfs/name</value>
  79. </property>
  80. <property>
  81. <name>dfs.datanode.data.dir</name>
  82. <value>file:/opt/bigdata/hadoop/tmp/dfs/data</value>
  83. </property>
  84. <property>
  85. <name>dfs.permissions</name>
  86. <value>false</value>
  87. </property>
  88. </configuration>
  89. -----

4.5 编辑 yarn-site.xml

  1. vim yarn-site.xml
  2. ----
  3. <configuration>
  4. <!-- Site specific YARN configuration properties -->
  5. <!-- 开启RM高可用 -->
  6. <property>
  7. <name>yarn.resourcemanager.ha.enabled</name>
  8. <value>true</value>
  9. </property>
  10. <!-- 指定RMcluster id -->
  11. <property>
  12. <name>yarn.resourcemanager.cluster-id</name>
  13. <value>yrc</value>
  14. </property>
  15. <!-- 指定RM的名字 -->
  16. <property>
  17. <name>yarn.resourcemanager.ha.rm-ids</name>
  18. <value>rm1,rm2</value>
  19. </property>
  20. <!-- 分别指定RM的地址 -->
  21. <property>
  22. <name>yarn.resourcemanager.hostname.rm1</name>
  23. <value>fat01.flyfish.com</value>
  24. </property>
  25. <property>
  26. <name>yarn.resourcemanager.hostname.rm2</name>
  27. <value>fat02.flyfish.com</value>
  28. </property>
  29. <!-- RM对外暴露的web http地址,用户可通过该地址在浏览器中查看集群信息 -->
  30. <property>
  31. <name>yarn.resourcemanager.webapp.address.rm1</name>
  32. <value>fat01.flyfish.com:8088</value>
  33. </property>
  34. <property>
  35. <name>yarn.resourcemanager.webapp.address.rm2</name>
  36. <value>fat02.flyfish.com:8088</value>
  37. </property>
  38. <!-- 指定zookeeper集群地址 -->
  39. <property>
  40. <name>yarn.resourcemanager.zk-address</name>
  41. <value>fat01.flyfish.com:2181,fat02.flyfish.com:2181,fat03.flyfish.com:2181</value>
  42. </property>
  43. <property>
  44. <name>yarn.nodemanager.aux-services</name>
  45. <value>mapreduce_shuffle</value>
  46. </property>
  47. <property>
  48. <name>yarn.application.classpath</name>
  49. <value>/opt/bigdata/hadoop/etc/hadoop:/opt/bigdata/hadoop/share/hadoop/common/lib/*:/opt/bigdata/hadoop/share/hadoop/common/*:/opt/bigdata/hadoop/share/hadoop/hdfs:/opt/bigdata/hadoop/share/hadoop/hdfs/lib/*:/opt/bigdata/hadoop/share/hadoop/hdfs/*:/opt/bigdata/hadoop/share/hadoop/mapreduce/lib/*:/opt/bigdata/hadoop/share/hadoop/mapreduce/*:/opt/bigdata/hadoop/share/hadoop/yarn:/opt/bigdata/hadoop/share/hadoop/yarn/lib/*:/opt/bigdata/hadoop/share/hadoop/yarn/*</value>
  50. </property>
  51. </configuration>
  52. -----

4.5 编辑 mapred-site.xml

  1. vim mapred-site.xml
  2. -----
  3. <configuration>
  4. <!-- 指定mr框架为yarn方式 -->
  5. <property>
  6. <name>mapreduce.framework.name</name>
  7. <value>yarn</value>
  8. </property>
  9. <!-- 配置 MapReduce JobHistory Server 地址 ,默认端口10020 -->
  10. <property>
  11. <name>mapreduce.jobhistory.address</name>
  12. <value>fat01.flyfish.com:10020</value>
  13. </property>
  14. <!-- 配置 MapReduce JobHistory Server web ui 地址, 默认端口19888 -->
  15. <property>
  16. <name>mapreduce.jobhistory.webapp.address</name>
  17. <value>fat01.flyfish.com:19888</value>
  18. </property>
  19. <property>
  20. <name>mapreduce.application.classpath</name>
  21. <value>/opt/bigdata/hadoop/share/hadoop/mapreduce/*,/opt/bigdata/hadoop/share/hadoop/mapreduce/lib/*</value>
  22. </property>
  23. </configuration>
  24. -----

4.6 修改works 文件

  1. fat01.flyfish.com
  2. fat02.flyfish.com
  3. fat03.flyfish.com

4.8 打包 同步所有节点

  1. fat01.flyfish.com 节点:
  2. cd /opt/bigdata/
  3. tar -zcvf hadoop.tar.gz hadoop
  4. scp hadoop.tar.gz root@192.168.11.195:/opt/bigdata/
  5. scp hadoop.tar.gz root@192.168.11.197:/opt/bigdata/

  1. fat02.flyfish.com 节点:
  2. cd /opt/bigdata/
  3. tar -zxvf hadoop.tar.gz
  4. fat03.flyfish.com 节点操作
  5. cd /opt/bigdata/
  6. tar -zxvf hadoop.tar.gz

4.9 启动所有节点的journalnode服务

  1. cd /opt/bigdata/hadoop/
  2. sbin/hadoop-daemon.sh start journalnode

图片.png-32.6kB

图片.png-16.1kB

图片.png-26.8kB

4.10 启动namenode 节点的HDFS

  1. 格式化hdfs
  2. hdfs namenode -format

图片.png-91.4kB

图片.png-50.3kB

  1. fat01.flyfish.com上生成的data文件夹复制到fat02.flyfish.com的相同目录下
  2. cd /opt/bigdata/hadoop/
  3. scp -r data/ root@192.168.11.195:/opt/bigdata/hadoop/
  4. 启动namenode
  5. hdfs --daemon start namenode

图片.png-22.1kB


  1. fat02.flyfish.com
  2. 执行 备用节点:
  3. hdfs namenode -bootstrapStandby
  4. hdfs --daemon start namenode

图片.png-57.1kB

4.11格式化ZK 在fat01.flyfish.com上面执行

  1. cd /opt/bigdata/hadoop/bin
  2. ./hdfs zkfc formatZK

图片.png-84.6kB


4.12 停掉/启动 hdfs 的所有 服务

  1. cd /opt/bigdata/hadoop/sbin/
  2. ./stop-dfs.sh
  3. ./start-dfs.sh

图片.png-41.7kB

图片.png-38.9kB

  1. 打开hdfs web页面

图片.png-65kB

图片.png-69.9kB

图片.png-68.7kB

图片.png-68.6kB

4.12 启动yarn

  1. cd /opt/bigdata/hadoop/
  2. sbin/start-yarn.sh 启动 yarn
  3. sbin/stop-yarn.sh 停掉 yarn

图片.png-24.8kB

图片.png-14.1kB

图片.png-12.3kB

图片.png-91.1kB

  1. 启动日志聚合功能:
  2. cd /opt/bigdata/hadoop/sbin/
  3. ./mr-jobhistory-daemon.sh start historyserver

图片.png-80.2kB


五:关于 HA 的测试

5.1 hdfs HA 测试

  1. 当前节点fat02.flyfish.com hdfs active 状态
  2. fat02.flyfish.com NN 服务停掉
  3. jps
  4. kill -9 94030
  5. fat01.flyfish.com 上的 NN 节点立马变为 active 状态

图片.png-19.8kB

图片.png-71.4kB


  1. 然后启动fat02.flyfish.com NN 节点
  2. hdfs --daemon start namenode
  3. fat02.flyfish.com 上面的NN 变为standby

图片.png-17.8kB

图片.png-61.4kB


5.2 yarn 的HA 测试

  1. 提交一个job
  2. hdfs dfs -mkdir /input
  3. hdfs dfs -put word.txt /input
  4. cd /opt/bigdata/hadoop/
  5. bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount /input /output1

图片.png-51.3kB

图片.png-43.4kB

图片.png-102.6kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注