Hadoop Namenode与Resourcemanager高可用搭建教程
一、引言
在大数据处理中,Hadoop集群的高可用性至关重要。本文将详细介绍如何搭建Hadoop Namenode和Resourcemanager的高可用环境,确保集群的稳定运行和数据的可靠存储与处理。
二、Namenode高可用搭建步骤
(一)环境准备
- 拍摄快照:在操作前,对三台服务器拍摄快照,以便后续恢复。
- 安装psmisc:在三台电脑上使用
xcall.sh yum install -y psmisc
命令安装psmisc
。 - 检查依赖安装:检查
jdk
以及zk
是否在三台服务器上均已安装完毕,同时检查是否已安装hadoop
集群,若已安装则需清空数据。先使用stop-all.sh
停止集群,再通过xcall.sh rm -rf /opt/installs/hadoop/tmp/ /opt/installs/hadoop/logs/
清理集群中的data
数据。
(二)配置文件修改
- 修改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
- 修改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>
- 修改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>
- 修改完毕之后,记得同步给bigdata02和03
xsync.sh hadoop-env.sh
(三)服务启动与验证
- 检查workers文件:确保
workers
文件包含三台服务器信息。 - 启动相关服务:
- 启动
zookeeper
:zk.sh start
。 - 初始化
ZKFC
在zk
中的Znode
信息(仅第一次启动时在bigdata01
上进行):hdfs zkfc -formatZK
。 - 在三台服务器上启动
jn
(journalnode
):hdfs --daemon start journalnode
。 - 对集群进行
namenode
的格式化:hdfs namenode -format
。 - 启动
hdfs
:start-dfs.sh
。 - 在
bigdata02
上启动第二个namenode
:第一次运行hdfs namenode -bootstrapStandby
,之后使用hadoop-daemon.sh start namenode
启动。
- 启动
- 查看状态:通过网页查看两个
namenode
的状态,并手动关闭第一台namenode
,测试第二台是否能自动从standby
变为active
,若再次启动第一台服务器的namenode
,其状态应为standby
。
三、Resourcemanager高可用搭建步骤
(一)配置文件检查与修改
- 检查mapred-site.xml:若其中只有
yarn
配置和historyServer
的配置,则无需修改。 - 修改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
集群,具体操作如下:
- 停止之前的
zk
集群。 - 下载与当前
hadoop
版本兼容的zk
安装包,并将其解压到/opt/installs
目录下。 - 对老的
zookeeper
文件夹进行重命名,使用xcall.sh mv /opt/installs/zookeeper /opt/installs/zookeeper-tmp
命令。 - 将新解压的
zk
文件夹重命名为zookeeper
,然后使用xsync.sh zookeeper
命令进行分发。 - 拷贝
zoo.cfg
文件,执行xcall.sh cp /opt/installs/zookeeper-tmp/conf/zoo.cfg /opt/installs/zookeeper/conf
命令。 - 在三台服务器上创建
zkData
文件夹,使用xcall.sh mkdir /opt/installs/zookeeper/zkData
命令,并拷贝myid
文件,执行xcall.sh cp /opt/installs/zookeeper-tmp/zkData/myid /opt/installs/zookeeper/zkData
命令。 - 启动
zk
集群,使用zk.sh start
命令,接着进行格式化操作hdfs zkfc -formatZK
,最后启动start-all.sh
脚本。
三、测试高可用性
- 停止
bigdata01
中的RM
服务。 - 使用
yarn rmadmin -getAllServiceState
命令查看服务状态的变化情况。 - 再次启动
bigdata01
的RM
服务,观察其状态是否转变为standby
,以此验证高可用性配置是否生效。