• 【大数据入门核心技术-Hadoop】Hadoop高可用集群搭建


    目录

    一、Hadoop部署的三种方式

    1、Standalone mode(独立模式)

    2、Pseudo-Distributed mode(伪分布式模式)

    3、Cluster mode(集群模式)

    二、准备工作

    1、先完成zk高可用搭建

    2、/etc/hosts增加内容

    3、各台服务器分别创建目录

    4、关闭防火墙和禁用swap交换分区

    5、三台机器间免密

    6、安装jdk

    7、下载好hadoop安装包

    三、高可用配置

    1、配置core-site.xml

    2、配置hdfs-site.xml

    3、配置yarn-site.xml文件

    4、配置mapred-site.xml

    5、配置workers

    6、修改配置hadoop-env.sh

    四、分发文件

    五、启动服务

    六、查看服务

    七、常见问题解决

    1、高可用下提示Operation category READ is not supported in state standby


    一、Hadoop部署的三种方式

    1、Standalone mode(独立模式)

    独立模式又称为单机模式,仅1个机器运行1个java进程,主要用于调试。

    2、Pseudo-Distributed mode(伪分布式模式)

    伪分布模式也是在1个机器上运行HDFS的NameNode和DataNode、YARN的 ResourceManger和NodeManager,但分别启动单独的java进程,主要用于调试。

    3、Cluster mode(集群模式)

    单Namenode节点模式-高可用HA模式

    集群模式主要用于生产环境部署。会使用N台主机组成一个Hadoop集群。这种部署模式下,主节点和从节点会分开部署在不同的机器上。

    本教程主要安装 多Namenode 节点 高可用集群模式

    二、准备工作

    1、先完成zk高可用搭建

    【大数据入门核心技术-Zookeeper】(五)ZooKeeper集群搭建

    2、/etc/hosts增加内容

    172.30.1.56 hadoop001

    172.30.1.57 hadoop001

    172.30.1.58 hadoop001

    3、各台服务器分别创建目录

    mkdir -p /data/bigdata/hadoop/tmp

    mkdir -p /data/bigdata/hadoop/var

    mkdir -p /data/bigdata/hadoop/dfs/name

    mkdir -p /data/bigdata/hadoop/dfs/data

    mkdir -p /data/bigdata/hadoop/jn

    4、关闭防火墙和禁用swap交换分区

    1)关闭防火墙和SeLinux

    systemctl stop firewalld && systemctl disable firewalld
    setenforce 0
    sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux

    2)禁用swap交换分区

    swapoff -a && sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux

    5、三台机器间免密

    生成密钥

    ssh-keygen -t rsa

    将密钥复制到其他机器

    ssh-copy-id slave1
    ssh-copy-id slave2

    6、安装jdk

    将jdk目录复制到/usr/local

    vim /etc/profile

    export JAVA_HOME=/usr/local/jdk1.8.0_131
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH

    source /etc/profile

    java -version

    查看结果

     java version "1.8.0_131"
    Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

    7、下载好hadoop安装


    下载地址

    Apache Hadoop

    本次以hadoop3.2.1下载为例

    解压
    tar zxvf hadoop-3.2.1.tar.gz -C /usr/local

    vim /etc/profile

    export HADOOP_HOME=/usr/local/hadoop-3.2.1
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

    source /etc/profile

    三、高可用配置

    1、配置core-site.xml

    1. <configuration>
    2. <!-- 把多个 NameNode 的地址组装成一个集群 mycluster -->
    3. <property>
    4. <name>fs.defaultFS</name>
    5. <value>hdfs://mycluster</value>
    6. </property>
    7. <!-- 指定 hadoop 运行时产生文件的存储目录 -->
    8. <property>
    9. <name>hadoop.tmp.dir</name>
    10. <value>/data/bigdata/hadoop/tmp</value>
    11. </property>
    12. <!-- 指定 zkfc 要连接的 zkServer 地址 -->
    13. <property>
    14. <name>ha.zookeeper.quorum</name>
    15. <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
    16. </property>
    17. <!-- NN 连接 JN 重试次数,默认是 10 次 -->
    18. <property>
    19. <name>ipc.client.connect.max.retries</name>
    20. <value>20</value>
    21. </property>
    22. <!-- 重试时间间隔,默认 1s -->
    23. <property>
    24. <name>ipc.client.connect.retry.interval</name>
    25. <value>5000</value>
    26. </property>
    27. </configuration>

    2、配置hdfs-site.xml

    1. <configuration>
    2. <property>
    3. <name>dfs.namenode.name.dir</name>
    4. <value>/data/bigdata/hadoop/dfs/name</value>
    5. <description>datanode 上存储 hdfs 名字空间元数据</description>
    6. </property>
    7. <property>
    8. <name>dfs.datanode.data.dir</name>
    9. <value>/data/bigdata/hadoop/dfs/data</value>
    10. <description>datanode 上数据块的物理存储位置</description>
    11. </property>
    12. <property>
    13. <name>dfs.replication</name>
    14. <value>2</value>
    15. <description>副本个数,默认配置是 3,应小于 datanode 机器数量</description>
    16. </property>
    17. <property>
    18. <name>dfs.webhdfs.enabled</name>
    19. <value>true</value>
    20. </property>
    21. <property>
    22. <name>dfs.permissions.enabled</name>
    23. <value>false</value>
    24. </property>
    25. <!-- JournalNode 数据存储目录 -->
    26. <property>
    27. <name>dfs.journalnode.edits.dir</name>
    28. <value>/data/bigdata/hadoop/jn</value>
    29. </property>
    30. <!-- 完全分布式集群名称 -->
    31. <property>
    32. <name>dfs.nameservices</name>
    33. <value>mycluster</value>
    34. </property>
    35. <!-- 集群中 NameNode 节点都有哪些 -->
    36. <property>
    37. <name>dfs.ha.namenodes.mycluster</name>
    38. <value>nn1,nn2,nn3</value>
    39. </property>
    40. <!-- NameNode 的 RPC 通信地址 -->
    41. <property>
    42. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    43. <value>hadoop101:8020</value>
    44. </property>
    45. <property>
    46. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    47. <value>hadoop102:8020</value>
    48. </property>
    49. <property>
    50. <name>dfs.namenode.rpc-address.mycluster.nn3</name>
    51. <value>hadoop103:8020</value>
    52. </property>
    53. <!-- NameNode 的 http 通信地址 -->
    54. <property>
    55. <name>dfs.namenode.http-address.mycluster.nn1</name>
    56. <value>hadoop101:9870</value>
    57. </property>
    58. <property>
    59. <name>dfs.namenode.http-address.mycluster.nn2</name>
    60. <value>hadoop102:9870</value>
    61. </property>
    62. <property>
    63. <name>dfs.namenode.http-address.mycluster.nn3</name>
    64. <value>hadoop103:9870</value>
    65. </property>
    66. <!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
    67. <property>
    68. <name>dfs.namenode.shared.edits.dir</name>
    69. <value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster</value>
    70. </property>
    71. <!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
    72. <property>
    73. <name>dfs.client.failover.proxy.provider.mycluster</name>
    74. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    75. </property>
    76. <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
    77. <property>
    78. <name>dfs.ha.fencing.methods</name>
    79. <value>sshfence</value>
    80. </property>
    81. <!-- 使用隔离机制时需要 ssh 秘钥登录-->
    82. <property>
    83. <name>dfs.ha.fencing.ssh.private-key-files</name>
    84. <value>/root/.ssh/id_rsa</value>
    85. </property>
    86. <!-- 启用 nn 故障自动转移 -->
    87. <property>
    88. <name>dfs.ha.automatic-failover.enabled</name>
    89. <value>true</value>
    90. </property>
    91. </configuration>

    3、配置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>hadoop101</value>
    26. </property>
    27. <!-- 指定 rm1 的 web 端地址 -->
    28. <property>
    29. <name>yarn.resourcemanager.webapp.address.rm1</name>
    30. <value>hadoop101:8088</value>
    31. </property>
    32. <!-- 指定 rm1 的内部通信地址 -->
    33. <property>
    34. <name>yarn.resourcemanager.address.rm1</name>
    35. <value>hadoop101:8032</value>
    36. </property>
    37. <!-- 指定 AM 向 rm1 申请资源的地址 -->
    38. <property>
    39. <name>yarn.resourcemanager.scheduler.address.rm1</name>
    40. <value>hadoop101:8030</value>
    41. </property>
    42. <!-- 指定供 NM 连接的地址 -->
    43. <property>
    44. <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
    45. <value>hadoop101:8031</value>
    46. </property>
    47. <!-- ========== rm2 的配置 ========== -->
    48. <!-- 指定 rm2 的主机名 -->
    49. <property>
    50. <name>yarn.resourcemanager.hostname.rm2</name>
    51. <value>hadoop102</value>
    52. </property>
    53. <property>
    54. <name>yarn.resourcemanager.webapp.address.rm2</name>
    55. <value>hadoop102:8088</value>
    56. </property>
    57. <property>
    58. <name>yarn.resourcemanager.address.rm2</name>
    59. <value>hadoop102:8032</value>
    60. </property>
    61. <property>
    62. <name>yarn.resourcemanager.scheduler.address.rm2</name>
    63. <value>hadoop102:8030</value>
    64. </property>
    65. <property>
    66. <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
    67. <value>hadoop102:8031</value>
    68. </property>
    69. <!-- ========== rm3 的配置 ========== -->
    70. <!-- 指定 rm3 的主机名 -->
    71. <property>
    72. <name>yarn.resourcemanager.hostname.rm3</name>
    73. <value>hadoop103</value>
    74. </property>
    75. <!-- 指定 rm3 的 web 端地址 -->
    76. <property>
    77. <name>yarn.resourcemanager.webapp.address.rm3</name>
    78. <value>hadoop103:8088</value>
    79. </property>
    80. <!-- 指定 rm3 的内部通信地址 -->
    81. <property>
    82. <name>yarn.resourcemanager.address.rm3</name>
    83. <value>hadoop103:8032</value>
    84. </property>
    85. <!-- 指定 AM 向 rm3 申请资源的地址 -->
    86. <property>
    87. <name>yarn.resourcemanager.scheduler.address.rm3</name>
    88. <value>hadoop103:8030</value>
    89. </property>
    90. <!-- 指定供 NM 连接的地址 -->
    91. <property>
    92. <name>yarn.resourcemanager.resource-tracker.address.rm3</name>
    93. <value>hadoop103:8031</value>
    94. </property>
    95. <!-- 指定 zookeeper 集群的地址 -->
    96. <property>
    97. <name>yarn.resourcemanager.zk-address</name>
    98. <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
    99. </property>
    100. <!-- 启用自动恢复 -->
    101. <property>
    102. <name>yarn.resourcemanager.recovery.enabled</name>
    103. <value>true</value>
    104. </property>
    105. <!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
    106. <property>
    107. <name>yarn.resourcemanager.store.class</name>
    108. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateSt ore</value>
    109. </property>
    110. <!-- 环境变量的继承 -->
    111. <property>
    112. <name>yarn.nodemanager.env-whitelist</name>
    113. <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS
    114. SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    115. </property>
    116. <!-- ZK中ZNode节点能存储的最大数据量,以字节为单位,默认是 1048576 字节,也就是1MB,现在扩大100倍 -->
    117. <property>
    118. <name>yarn.resourcemanager.zk-max-znode-size.bytes</name>
    119. <value>104857600</value>
    120. </property>
    121. <!--用于状态存储的类,可以设置为-->
    122. <property>
    123. <name>yarn.resourcemanager.store.class</name>
    124. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    125. </property>
    126. </configuration>

    4、配置mapred-site.xml

    1. <configuration>
    2. <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
    3. <property>
    4. <name>mapreduce.framework.name</name>
    5. <value>yarn</value>
    6. </property>
    7. <!-- 历史服务器端地址 -->
    8. <property>
    9. <name>mapreduce.jobhistory.address</name>
    10. <value>hadoop101:10020</value>
    11. </property>
    12. <!-- 历史服务器 web 端地址 -->
    13. <property>
    14. <name>mapreduce.jobhistory.webapp.address</name>
    15. <value>hadoop101:19888</value>
    16. </property>
    17. </configuration>

    5、配置workers

    1. hadoop101
    2. hadoop102
    3. hadoop103

    6、修改配置hadoop-env.sh

    1. export JAVA_HOME=/usr/local/jdk1.8.0_131
    2. export HADOOP_HOME=/usr/local/hadoop-2.3.1
    3. export HDFS_NAMENODE_USER=root
    4. export HDFS_DATANODE_USER=root
    5. export HDFS_JOURNALNODE_USER=root
    6. export HDFS_ZKFC_USER=root
    7. export HDFS_SECONDARYNAMENODE_USER=root
    8. export YARN_RESOURCEMANAGER_USER=root
    9. export YARN_NODEMANAGER_USER=root

    四、分发文件

    scp -r /usr/local/hadoop-3.2.1 hadoop102:/usr/local

    scp -r /usr/local/hadoop-3.2.1 hadoop103:/usr/local

    五、启动服务

    在各个 JournalNode 节点上(每台虚拟机),输入以下命令启动 journalnode 服务

    hdfs --daemon start journalnode

    node1上格式化namenode
    hdfs namenode -format

    node1上启动namenode
    hdfs --daemon start namenode

    在 [nn2,nn3] 上,同步 nn1 的元数据信息
    hdfs namenode -bootstrapStandby

    在node1节点上格式化ZKFC
    hdfs zkfc -formatZK

    node1节点上启动HDFS和Yarn
    start-dfs.sh
    start-yarn.sh

    到此hadoop高可用集群搭建就完成了。

    六、查看服务

    jps

    查看yarn服务状态

    yarn rmadmin  -getAllServiceState

    yarn rmadmin -getServiceState rm1

    zkCli.sh 客户端查看 ResourceManager 选举锁节点内容:

    get -s /yarn-leader-election/cluster-yarn1/ActiveStandbyElectorLock

    七、常见问题解决

    1、高可用下提示Operation category READ is not supported in state standby

    hadoop fs -ls / 

    总提示

    hadoop fs -ls /

    2022-12-06 02:02:22,062 INFO retry.RetryInvocationHandler: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby. Visit https://s.apache.org/sbnn-error

            at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:98)

            at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:2021)

            at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1449)

            at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3183)

            at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1173)

    解决办法:

    手动将活跃的namenode切换到第一台

    hdfs haadmin -failover nn3 nn1

  • 相关阅读:
    「程序员必须掌握的算法」双指针「上篇」
    5.2 基于ROP漏洞挖掘与利用
    力扣(LeetCode)809. 情感丰富的文字(C++)
    Socks5代理IP在网络安全、跨境电商和游戏中的应用
    电脑换cpu要重装系统吗
    智能配电室运维云平台
    C语言打印出九九乘法表
    Java笔记:多线程基础
    基于java+springboot+mybatis+vue+elementui的零食销售商城网站
    弹性盒子自动换行小Demo
  • 原文地址:https://blog.csdn.net/forest_long/article/details/128157294