Hadoop集群的高可用(HA)- (1、搭建namenode的高可用)

HA: High Availability,高可用集群,指的是集群7*24小时不间断服务

Hadoop中存在单点故障问题:NameNode ResourceManager

在搭建hadoop集群的高可用之前,先将集群进行快照。

搭建namenode的高可用

先将三台服务器拍摄快照,便于后面的恢复!!!

第一步:bigdata01和bigdata02都能免密登录到其他三台

因为以前bigdata01 已经免密登录其他三台,不需要做。

进入到bigdata02中:

ssh-keygen -t rsa

发送公钥(所有NameNode节点都要发送)

ssh-copy-id bigdata01

ssh-copy-id bigdata02

ssh-copy-id bigdata03

第二步:三台电脑上都同时安装psmisc

ZKFC远程杀死假死NN使用的killall namenode命令属于该软件中的。

建议所有节点都安装psmisc

以下命令是在bigdata01上运行的,因为只有01 配置了xcall命令

xcall.sh yum install -y psmisc

第三步:检查jdk以及zk 三台是否都安装完毕

第四步:检查是否安装了hadoop集群,如果以前安装过了,清空数据

先停止集群:stop-all.sh

清理集群中的data数据:

复制代码
xcall.sh rm -rf /opt/installs/hadoop/tmp/ /opt/installs/hadoop/logs/

第五步:配置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

修改完毕之后,记得同步给bigdata02和03

复制代码
xsync.sh hadoop-env.sh

第六步:修改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>

第八步:检查workers 文件是否为三台服务

第九步:同步 core-site.xml 和 hdfs-site.xml 到剩余两台上去

复制代码
xsync.sh core-site.xml hdfs-site.xml

第十步:

第一次启动

复制代码
1、启动zookeeper
zk.sh start
2. 初始化ZKFC在zk中的Znode信息【第一次启动需要做】在bigdata01上进行即可
hdfs zkfc -formatZK
3、在三台服务器上启动jn【journalnode 主要用于存储namenode的元数据】
hdfs --daemon start journalnode,否则报8345
这个为什么在这个时候启动,原因是第四步格式化的时候,需要用到journalnode,否则报8485连接超时的问题,格式化会失败的。
4、对集群进行namenode的格式化
hdfs namenode -format
5、启动hdfs
start-dfs.sh
这个服务默认会启动journalnode,但是由于你之前已经单独启动过了,所以启动它会报三个警告,可以忽略,无所谓。
6、启动第二个namenode
需要在bigdata02上运行:
第一次需要运行如下命令,以后不需要:
hdfs namenode -bootstrapStandby
接着,启动第二个namenode:
hadoop-daemon.sh start namenode

本身集群是可以启动两个namenode的,但是由于第一次启动的话,bigdata02上没有格式化,所以无法启动,第二次就不需要了。

综上所述:

只要配置好了以后,以后启动高可用,命令只需要执行 start-dfs.sh 即可。当然zk还是单独管理。

第十一步:通过网页查看两个namenode的状态

查看第二个namenode:

第十二步:测试是否可以高可用

手动将第一台的namenode给关闭,第二台要自动从 standby变为active

假如第一次服务器再次启动namenode,状态应为为standby

相关推荐
数据库安全3 分钟前
山东省某三甲医院基于分类分级的数据安全防护建设实践
大数据·人工智能
七牛云行业应用6 分钟前
从API调用到智能体编排:GPT-5时代的AI开发新模式
大数据·人工智能·gpt·openai·agent开发
蒙特卡洛的随机游走20 分钟前
Spark的宽依赖与窄依赖
大数据·前端·spark
9号达人25 分钟前
if-else 优化的折中思考:不是消灭分支,而是控制风险
java·后端·面试
不知道累,只知道类1 小时前
Java 在AWS上使用SDK凭证获取顺序
java·aws
智象科技1 小时前
CMDB报表体系如何驱动智能运维
大数据·运维·报表·一体化运维·cmdb
咖啡Beans1 小时前
SpringBoot2.7集成Swagger3.0
java·swagger
嘉禾望岗5031 小时前
hive join优化和数据倾斜处理
数据仓库·hive·hadoop
聪明的笨猪猪1 小时前
Java JVM “垃圾回收(GC)”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
yumgpkpm1 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
大数据·hive·hadoop·elasticsearch·zookeeper·big data·cloudera