Hadoop Namenode与Resourcemanager高可用搭建教程

Source

Hadoop Namenode与Resourcemanager高可用搭建教程

一、引言

在大数据处理中,Hadoop集群的高可用性至关重要。本文将详细介绍如何搭建Hadoop Namenode和Resourcemanager的高可用环境,确保集群的稳定运行和数据的可靠存储与处理。

二、Namenode高可用搭建步骤

(一)环境准备

  1. 拍摄快照:在操作前,对三台服务器拍摄快照,以便后续恢复。
  2. 安装psmisc:在三台电脑上使用xcall.sh yum install -y psmisc命令安装psmisc
  3. 检查依赖安装:检查jdk以及zk是否在三台服务器上均已安装完毕,同时检查是否已安装hadoop集群,若已安装则需清空数据。先使用stop-all.sh停止集群,再通过xcall.sh rm -rf /opt/installs/hadoop/tmp/ /opt/installs/hadoop/logs/清理集群中的data数据。

(二)配置文件修改

  1. 修改hadoop-env.sh
export JAVA_HOME=/opt/installs/jdk/ 

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
  1. 修改core-site.xml
<configuration>
  <!--hdfs入口,设置虚拟地址,具体地址后面配置-->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hdfs-cluster</value>
  </property>
  <!--hdfs集群的文件位置-->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/installs/hadoop/tmp</value>
  </property>
  <!--hdfs要访问zookeeper集群-->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
  </property>
</configuration>
  1. 修改hdfs-site.xml
<configuration>
    <!-- 副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!-- 定义hdfs入口的命名服务 -->
    <property>
        <name>dfs.nameservices</name>
        <value>hdfs-cluster</value>
    </property>
    <!-- 定义hdfs入口的命名服务下虚拟ip-->
    <property>
        <name>dfs.ha.namenodes.hdfs-cluster</name>
        <value>nn1,nn2</value>
    </property>
    <!-- 虚拟ip地址1 RPC入口 -->
    <property>
        <name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name>
        <value>bigdata01:9820</value>
    </property>
    <!-- 虚拟ip地址1 HTTP入口 -->
    <property>
        <name>dfs.namenode.http-address.hdfs-cluster.nn1</name>
        <value>bigdata01:9870</value>
    </property>
    <!-- 虚拟ip地址2 PRC入口 -->
    <property>
        <name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name>
        <value>bigdata02:9820</value>
    </property>
    <!-- 虚拟ip地址1 HTTP入口 -->
    <property>
        <name>dfs.namenode.http-address.hdfs-cluster.nn2</name>
        <value>bigdata02:9870</value>
    </property>
    
    <!-- 定义QJN在linux中保存文件磁盘目录 -->
    <property>
        <!-- Journal Edit Files 的存储目录:() -->
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/installs/journalnode/data/</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/hdfs-cluster</value>
    </property>
    
    
    <!-- 是否开启故障切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    
    
    <!-- 基于zookeeper的故障切换的代码类 -->
    <property>
        <name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    
    
    <!-- 远程杀死namenode方式(防止namenode假死,导致双主出现) -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <!-- 指定私钥的文件目录,使用免密登录杀死NN进程 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>

    <!-- 可以在hdfs上点击结果查看-->
    <property>
      <name>dfs.webhdfs.enabled</name>
      <value>true</value>
    </property>
</configuration>
  1. 修改完毕之后,记得同步给bigdata02和03
xsync.sh hadoop-env.sh

(三)服务启动与验证

  1. 检查workers文件:确保workers文件包含三台服务器信息。
  2. 启动相关服务
    • 启动zookeeperzk.sh start
    • 初始化ZKFCzk中的Znode信息(仅第一次启动时在bigdata01上进行):hdfs zkfc -formatZK
    • 在三台服务器上启动jnjournalnode):hdfs --daemon start journalnode
    • 对集群进行namenode的格式化:hdfs namenode -format
    • 启动hdfsstart-dfs.sh
    • bigdata02上启动第二个namenode:第一次运行hdfs namenode -bootstrapStandby,之后使用hadoop-daemon.sh start namenode启动。
  3. 查看状态:通过网页查看两个namenode的状态,并手动关闭第一台namenode,测试第二台是否能自动从standby变为active,若再次启动第一台服务器的namenode,其状态应为standby

三、Resourcemanager高可用搭建步骤

(一)配置文件检查与修改

  1. 检查mapred-site.xml:若其中只有yarn配置和historyServer的配置,则无需修改。
  2. 修改yarn-site.xml
  <?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>

  <!-- Site specific YARN configuration properties -->

  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value> 
  </property>

  <property>
    <name>yarn.application.classpath</name>
    <value>/opt/installs/hadoop/etc/hadoop:/opt/installs/hadoop/share/hadoop/common/lib/*:/opt/installs/hadoop/share/hadoop/common/*:/opt/installs/hadoop/share/hadoop/hdfs:/opt/installs/hadoop/share/hadoop/hdfs/lib/*:/opt/installs/hadoop/share/hadoop/hdfs/*:/opt/installs/hadoop/share/hadoop/mapreduce/*:/opt/installs/hadoop/share/hadoop/yarn:/opt/installs/hadoop/share/hadoop/yarn/lib/*:/opt/installs/hadoop/share/hadoop/yarn/*</value> 
  </property>

  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>

  <!-- 历史日志在HDFS保存的时间,单位是秒 -->
  <!-- 默认的是-1,表示永久保存 -->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
  </property>

  <property>
    <name>yarn.log.server.url</name>
    <value>http://bigdata01:19888/jobhistory/logs</value>
  </property>

  <!--配置resourcemanager的HA-->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <!-- RM 集群标识 -->
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-cluster</value>
  </property> 
  <!-- RM 的逻辑 ID 列表 -->
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property> 
  <!-- RM1 的主机地址 -->
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>bigdata01</value>
  </property>
  <!-- RM1 的主机web管理界面地址 --> 
  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>bigdata01:8088</value>
  </property>
  <!-- RM2 的主机地址 -->
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>bigdata02</value>
  </property> 
  <!-- RM2 的主机web管理界面地址 -->  
  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>bigdata02:8088</value>
  </property>
  <!-- ZooKeeper 集群的地址 -->  
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
  </property> 
  <!-- 启用自动恢复 --> 
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property> 
  <!-- 用于yarn故障转移持久化zk的类 -->
  <property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property> 

<!-- 关闭虚拟内存检查 -->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
 </property>

</configuration>

修改后,使用xsync.sh yarn-site.xml同步。

(二)

服务启动与测试流程

一、启动 Yarn

通过执行 start-yarn.sh 脚本启动 Yarn 服务。

二、查看服务状态

使用 yarn rmadmin -getAllServiceState 命令来查看各个服务的状态,明确哪些是处于工作状态(active),哪些是备用状态(standby)。若在启动过程中发现存在两个 resourcemanager 且均为 standby 状态,这可能是由于版本兼容性问题导致的。例如,hadoop3.1.6 版本需要与 zookeeper 3.4.10 兼容,hadoop3.3.1 则需与 zookeeper 3.6.4 兼容。此时,需要切换 zookeeper 集群,具体操作如下:

  1. 停止之前的 zk 集群。
  2. 下载与当前 hadoop 版本兼容的 zk 安装包,并将其解压到 /opt/installs 目录下。
  3. 对老的 zookeeper 文件夹进行重命名,使用 xcall.sh mv /opt/installs/zookeeper /opt/installs/zookeeper-tmp 命令。
  4. 将新解压的 zk 文件夹重命名为 zookeeper,然后使用 xsync.sh zookeeper 命令进行分发。
  5. 拷贝 zoo.cfg 文件,执行 xcall.sh cp /opt/installs/zookeeper-tmp/conf/zoo.cfg /opt/installs/zookeeper/conf 命令。
  6. 在三台服务器上创建 zkData 文件夹,使用 xcall.sh mkdir /opt/installs/zookeeper/zkData 命令,并拷贝 myid 文件,执行 xcall.sh cp /opt/installs/zookeeper-tmp/zkData/myid /opt/installs/zookeeper/zkData 命令。
  7. 启动 zk 集群,使用 zk.sh start 命令,接着进行格式化操作 hdfs zkfc -formatZK,最后启动 start-all.sh 脚本。

三、测试高可用性

  1. 停止 bigdata01 中的 RM 服务。
  2. 使用 yarn rmadmin -getAllServiceState 命令查看服务状态的变化情况。
  3. 再次启动 bigdata01RM 服务,观察其状态是否转变为 standby,以此验证高可用性配置是否生效。