DFS block丢失过多进入安全模式(safe mode)的解决方法

本文介绍了当HDFS因dataNode数据块丢失进入安全模式时的处理方法。首先通过命令退出安全模式,然后使用健康检查命令删除损坏的数据块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDFS block丢失过多进入安全模式(Safe mode)的解决方法

背景及现象描述(Background and Symptom)

 

 因磁盘空间不足,内存不足,系统掉电等其他原因导致dataNode datablock丢失,出现如下类似日志:

 

The number of live datanodes 3 has reached the minimum number 0.

Safe mode will be turned off automatically once the thresholds have been reached.

Caused by: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Log not rolled.

 Name node is in safe mode.

The reported blocks 632758 needs additional 5114 blocks to reach the threshold 0.9990

of total blocks 638510.

The number of live datanodes 3 has reached the minimum number 0.

Safe mode will be turned off automatically once the thresholds have been reached.

at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkNameNodeSafeMode

(FSNamesystem.java:1209)

    ... 12 more

 

 

原因分析(Cause Analysis)*

由于系统断电,内存不足等原因导致dataNode丢失超过设置的丢失百分比,系统自动进入安全模式

解决办法(Solution)*

安装HDFS客户端,并执行如下命令:

                                步骤 1     执行命令退出安全模式:hadoop dfsadmin -safemode leave

                                步骤 2     执行健康检查,删除损坏掉的block。  hdfs fsck  /  -delete


用户可以通过dfsadmin -safemode value 来操作安全模式,参数value的说明如下:
enter - 进入安全模式
leave - 强制NameNode离开安全模式
get - 返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束。

 

注意: 这种方式会出现数据丢失,损坏的block会被删掉


NameNode主节点启动时,HDFS会首先进入安全模式,检查包括文件副本的数量、可用的datanode数量、集群可用block比例等参数。以上参数达到阈值(可配置)后,H即可视为系统达到安全标准,HDFS自动离开安全模式。在安全模式下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。且文件block不能进行任何的副本复制操作,因此达到最小的副本数量要求是基于datanode启动时的状态来判定的,启动时不会再做任何复制(从而达到最小副本数量要求)安全模式相关配置系统什么时候才离开安全模式,需要满足哪些条件?可以根据以下配置内容进行确定 如果有必要,也可以通过命令强制离开安全模式。与安全模式相关的主要配置在hdfs-site.xml文件中,主要有下面几个属性dfs.namenode.replication.min: 最小的block副本数量,默认为1。dfs.namenode.safemode.threshold-pct: 副本数达到最小要求的block占系统总block数的百分比,当实际比例超过该配置后,才能离开安全模式(但是还需要其他条件也满足)。默认为0.999f,也就是说符合最小副本数要求的block占比超过99.9%时,并且其他条件也满足才能离开安全模式。如果小于等于0,则不会等待任何block副本达到要求即可离开。如果大于1,则永远处于安全模式dfs.namenode.safemode.min.datanodes: 离开安全模式的最小可用datanode数量要求,默认为0。即所有datanode都不可用,仍然可以离开安全模式dfs.namenode.safemode.extension: 集群可用block比例、可用datanode都达到要求之后,如果在extension配置的时间段之后依然能满足要求,此时集群才离开安全模式。单位为毫秒,默认为1。也就是当满足条件并且能够维持1毫秒之后,离开安全模式。这个配置主要是对集群的稳定程度做进一步的确认。避免达到要求后马上又不符合安全标准。总结一下,要离开安全模式,需要满足以下条件:1)达到副本数量要求的block比例满足要求;2)可用的datanode节点数满足配置的数量要求;3) 1、2 两个条件满足后维持的时间达到配置的要求。
最新发布
04-06
### HDFS安全模式的工作原理 HDFS安全模式是一种保护机制,用于确保集群中的数据块在启动或其他特定情况下能够保持一致性。在这种模式下,HDFS仅允许元数据的读取操作,而禁止任何写入或删除操作[^1]。具体来说: - **工作原理** 当NameNode启动时,它会自动进入安全模式。在此期间,系统会对所有的数据块进行扫描和验证,以确认它们的副本数量是否满足预设的要求。如果发现某些数据块的副本不足,则会在其他DataNode上重新创建这些缺失的副本[^2]。 - **离开条件** NameNode会持续监控整个集群的状态,并计算已报告的数据块占总数据块的比例。当这个比例超过`dfs.namenode.safemode.threshold-pct`所设定的阈值时,NameNode将退出安全模式并恢复正常运行状态。例如,默认值为0.999f,意味着至少要有99.9%的数据块被成功报告后才能离开安全模式。 ### 配置参数详解 以下是几个重要的配置参数及其作用说明: #### `dfs.namenode.safemode.threshold-pct` 此参数决定了HDFS离开安全模式所需的数据块百分比。其默认值为0.999f,表示只有当实际存在的有效数据块达到理论总数的99.9%以上时才会退出安全模式。可以通过调整该值来改变这一行为;比如将其设置为小于等于零的小数值甚至负数可以让系统永不进入安全模式。 ```xml <property> <name>dfs.namenode.safemode.threshold-pct</name> <value>0.99f</value> </property> ``` #### `dfs.namenode.safemode.min.datanodes` 定义了最小活跃DataNodes的数量,在低于这个数目之前不会考虑离开安全模式。即使所有现存blocks都已被汇报完毕但如果连接上的Datanodes未达标准依旧维持现状直到满足要求为止[^3]。 #### `dfs.namenode.safemode.extension` 延长额外等待时间(毫秒单位),即便已经达到上述两个条件之后也会再延缓这么长时间才真正关闭safety mode以便进一步稳定环境状况。 ```xml <property> <name>dfs.namenode.safemode.extension</name> <value>30000</value><!-- 即30秒 --> </property> ``` #### `dfs.namenode.replication.min` 指定了单个文件最低应具备多少份拷贝才算合格完成复制过程的标准之一。假如某文档目前仅有两份copy存放在不同节点里但规定需三份及以上才算达标的话那么仍旧会被视为欠完备从而触发修复动作直至符合预期水平为止。 --- ### 示例代码展示如何查看当前是否处于safe mode以及手动强制退出的方法 下面提供了一段简单的Shell命令用来检测现在是不是处在Safe Mode当中同时也演示怎样人为干预让NN尽快脱离这种情况(注意生产环境下谨慎执行): ```bash # 查看当前是否处于安全模式 hdfs dfsadmin -safemode get # 如果需要立即退出安全模式可使用如下指令 hdfs dfsadmin -safemode leave ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值