• Hadoop3教程(三十二):(生产调优篇)NameNode故障恢复与集群的安全模式


    (159)NameNode故障处理

    如果NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode?

    首先,我们可以通过以下代码来模拟故障:

    (1)kill -9 NameNode进程

    [atguigu@hadoop102 current]$ kill -9 19886
    
    • 1

    (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)

    [atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/dfs/name/*
    
    • 1

    接下来,我们开始解决问题:

    (1)拷贝SecondaryNameNode中数据到原NameNode存储数据目录

    [atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/dfs/namesecondary/* ./name/
    
    • 1

    (2)重新启动NameNode

    [atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
    
    • 1

    (3)向集群上传一个文件

    那是不是这种方式能完全保证没有数据遗漏呢?

    自然是不能的,因为SecondaryNameNode备份数据不是实时的,而是每隔一段时间去备份一次NN,假如正好在这段时间里,NN写入了大量数据,那这些自然 就遗失掉了。

    不过现实中一般不会用SecondaryNameNode做备份的方式,而是采用NameNode的高可用HA模式,即启用两个NameNode的方式来容灾

    所以本节的内容做简单了解下就行了。

    (160)集群安全模式&磁盘修复

    集群安全模式

    集群在启动的时候会进入安全模式一段时间,等待数据和节点等加载到一定程度后,才会自动退出安全模式。

    当集群处于安全模式中时,文件系统只接受读数据请求,而不接受删除、修改等变更请求。

    所以集群启动后,一段时间内,其实是无法上传数据、删除数据的。

    什么场景下会进入安全模式呢?

    • NameNode在加载镜像文件和编辑日志的时候,会处于安全模式;(就是指集群启动的时候)
    • NameNode在接收DataNode注册时,会处于安全模式;
    • 数据块的副本缺失。导致某些数据块的可用副本数量少于设置值;
    • 。。。

    满足什么条件时,集群会退出安全模式呢?

    主要是依赖以下三个条件:

    dfs.namenode.safemode.min.datanodes:即最小可用datanode数量,默认0。换句话说,集群需要有至少一个DataNode是可用的;

    dfs.namenode.safemode.threshold-pct:副本数达到最小要求的block占系统总block数的百分比,默认0.999f。就是说,只要有超过一个块丢了,集群就不能退出安全模式。

    dfs.namenode.safemode.extension:稳定时间,默认值30000毫秒,即30秒。即集群处于安全模式已经超过了30s。

    以上三个条件都满足时,集群才会自动退出安全模式。对应的这几个参数都是在hdfs-default.xml里进行设置的。

    关于安全模式,集群支持的指令有:

    (1)bin/hdfs dfsadmin -safemode get	(功能描述:查看安全模式状态)
    (2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
    (3)bin/hdfs dfsadmin -safemode leave	(功能描述:离开安全模式状态)
    (4)bin/hdfs dfsadmin -safemode wait	(功能描述:等待安全模式状态)
    
    • 1
    • 2
    • 3
    • 4

    磁盘修复

    接下来模拟一下,由于数据块损坏,而进入安全模式的案例。

    (1)分别进入hadoop102、hadoop103、hadoop104的/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1015489500-192.168.10.102-1611909480872/current/finalized/subdir0/subdir0目录,统一删除某2个块信息

    [atguigu@hadoop102 subdir0]$ pwd
    /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1015489500-192.168.10.102-1611909480872/current/finalized/subdir0/subdir0
    
    [atguigu@hadoop102 subdir0]$ rm -rf blk_1073741847 blk_1073741847_1023.meta
    [atguigu@hadoop102 subdir0]$ rm -rf blk_1073741865 blk_1073741865_1042.meta
    
    • 1
    • 2
    • 3
    • 4
    • 5

    说明:hadoop103/hadoop104重复执行以上命令

    但是你删除后会发现,集群仍然还在正常工作,也没有进入安全模式。这是因为NameNode还没有发现自己少数据了 。因为默认情况下,DataNode是每隔六小时会向NameNode主动汇报自己的数据情况,只有到那时候,NameNode才知道出事了,才能启动安全模式。

    所以在本次模拟中,我们可以采用重新启动集群的方式,让NameNode立马知道出事了。因为集群启动时,各个DataNode会统一向NameNode 汇报自己的数据情况。

    ​ (2)重新启动集群

    [atguigu@hadoop102 subdir0]$ myhadoop.sh stop
    [atguigu@hadoop102 subdir0]$ myhadoop.sh start
    
    • 1
    • 2

    ​ (3)观察http://hadoop102:9870/dfshealth.html#tab-overview

    在这里插入图片描述

    ​ 说明:安全模式已经打开,原因是块的数量没有达到要求。

    ​ (4)手动离开安全模式

    [atguigu@hadoop102 subdir0]$ hdfs dfsadmin -safemode get
    Safe mode is ON
    [atguigu@hadoop102 subdir0]$ hdfs dfsadmin -safemode leave
    Safe mode is OFF
    
    • 1
    • 2
    • 3
    • 4

    ​ (5)观察http://hadoop102:9870/dfshealth.html#tab-overview

    在这里插入图片描述

    现在整个集群已经退出了安全模式,可以进行正常的删除和修改,只是界面最上面会一直提示你,少了两个文件块。如果你不准备修复,同时嫌弃这个提示碍眼的话,可以去到HDFS目录里,把这两个文件块对应的元数据给删掉。只要删掉对应的元数据,那么谁都不会知道这两个文件块曾经存在过。

    ​ (6)将元数据删除

    在这里插入图片描述

    在这里插入图片描述

    (7)观察http://hadoop102:9870/dfshealth.html#tab-overview,集群已经正常,没有再提示缺文件块了。

    等待安全模式

    核心是hdfs dfsadmin -safemode wait这个命令。

    它的作用是,如果检测到集群处于安全模式中,该命令就会卡住,直到其重新检测到集群已经退出安全模式后,才会退出阻塞状态,继续执行后续的命令。

    所以一般用来写一些特殊的脚本,脚本里是你希望在集群退出安全模式后,立即执行的一些处理。

    直接抄教程里的例子(当集群退出安全模式后,立即上传指定文件):

    (1)查看当前模式

    [atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -safemode get
    
    Safe mode is OFF
    
    • 1
    • 2
    • 3

    (2)先进入安全模式

    [atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode enter
    
    • 1

    (3)创建并执行下面的脚本

    在/opt/module/hadoop-3.1.3路径上,编辑一个脚本safemode.sh

    [atguigu@hadoop102 hadoop-3.1.3]$ vim safemode.sh
    
    #!/bin/bash
    hdfs dfsadmin -safemode wait
    hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
    
    [atguigu@hadoop102 hadoop-3.1.3]$ chmod 777 safemode.sh
    [atguigu@hadoop102 hadoop-3.1.3]$ ./safemode.sh 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    脚本safemode.sh的意思是,如果检测到集群处于安全模式,则阻塞当前进程,直到集群退出安全模式,停止阻塞,然后立刻上传README.txt文件到HDFS。

    (4)再打开一个窗口,执行:

    [atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode leave
    
    • 1

    (5)再观察上一个窗口:

    Safe mode is OFF
    
    • 1

    (6)HDFS集群上已经有上传的数据了

    在这里插入图片描述

    参考文献

    1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】
  • 相关阅读:
    Vue中使用百度地图
    Spring Boot 各版本的支持时间
    地理探测器原理介绍
    Mybatis主键自动生成
    手把手教你纯c实现异常捕获try-catch组件
    力扣每日一题:1710. 卡车上的最大单元数【自定义排序+贪心】
    再给你安利一款免费代码生成器
    leetcode 35. 搜索插入位置(二分法+找性质也很关键)
    kernelbase.dll故障怎么处理的几种常见方法,有效的解决kernelbase.dll故障
    spring自定义异常处理,前端接收抛出结果
  • 原文地址:https://blog.csdn.net/wlh2220133699/article/details/133968859