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

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

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
当执行 Hadoop 命令时出现: ``` put: NameNode is in safe mode ``` 或在日志中看到: ``` org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create file /user/hadoop/test.txt. Name node is in safe mode ``` 这表示 **NameNode 正处于安全模式Safe Mode)**,此时 HDFS 是只读的,不允许写入、删除、重命名等操作。 --- ### ✅ 一、什么是 Safe Mode? > **Safe ModeNameNode 启动过程中的一个特殊状态**,用于检查 HDFS 文件系统的元数据完整性和块复制率。 在此模式下: - ❌ 不允许修改文件系统(不能写、删、改) - ✅ 只允许读取操作(如 `hdfs dfs -ls`, `-cat`) 📌 NameNode 会在以下情况自动进入 Safe Mode: 1. 刚启动时(正常行为) 2. 手动触发了 `hdfs dfsadmin -safemode enter` 3. 集群异常重启后 --- ### ✅ 二、为什么 NameNode 长时间卡在 Safe Mode? 正常情况下,NameNode 在启动几十秒后会**自动退出** Safe Mode。 但如果长时间未退出,通常是由于: #### 🔴 原因1:DataNode 没有启动或数量不足 - DataNode 没起来 → Block 报告不全 → 达不到阈值 - 导致 NameNode 认为集群不可靠,拒绝退出 Safe Mode 🔧 **解决方案**:先解决 DataNode 启动问题(参考你之前的提问),确保所有 DataNode 成功注册。 ```bash # 在每个 DataNode 上检查 jps | grep DataNode # 查看 NameNode Web UI http://<namenode-host>:9870 → 点击 "Datanodes" 查看是否上线 ``` --- #### 🔴 原因2:块复制率低于阈值(默认 99.9%) NameNode 默认要求至少 **99.9% 的数据块**达到最小副本数(通常是 `dfs.replication` 设置的值,如 3)才会自动退出 Safe Mode。 如果某些块缺失太多副本(比如只有 1 个副本,甚至 0 个),就会卡住。 🔍 查看当前块统计信息: ```bash hdfs dfsadmin -report ``` 输出示例如下: ``` Configured Capacity: ... DFS Used: ... Non DFS Used: ... DFS Remaining: ... Block Pool Used: ... Percent Used: 0.00% Live datanodes: 1 (expected: 3) ← 这里显示只有一台存活! ... ``` 👉 如果 Live datanodes 数量远少于预期,说明节点没起来。 --- ### ✅ 三、如何手动退出 Safe Mode? 如果你确认环境没问题(比如测试环境只有一个 DataNode),可以**强制退出 Safe Mode**。 #### ✅ 方法1:手动离开 Safe Mode ```bash hdfs dfsadmin -safemode leave ``` ✅ 输出: ``` Safe mode is OFF ``` 之后就可以正常写入了: ```bash echo "hello" | hdfs dfs -put - /test.txt ``` --- #### ✅ 方法2:等待自动退出(推荐生产环境使用) 让 NameNode 自己判断条件满足后退出: ```bash # 查看当前状态 hdfs dfsadmin -safemode get # 输出:Safe mode is ON 或 OFF # 等待直到自动关闭(需要足够多的 DataNode 上线) ``` --- ### ✅ 四、调整 Safe Mode 的触发阈值(可选) 可以通过修改配置来降低退出 Safe Mode 所需的块比例。 编辑 `hdfs-site.xml`: ```xml <property> <name>dfs.namenode.safemode.threshold-pct</name> <value>0.90</value> <description> Number of blocks that must meet the minimal replication requirement before the name node exits safemode. Range: 0 to 1. 设置为 0.9 表示只要 90% 的块达标即可退出 </description> </property> ``` ⚠️ 注意: - 生产环境建议保持默认 `0.999`(即 99.9%) - 测试环境可设为 `0` 实现立即退出: ```xml <value>0.0</value> <!-- 立刻退出 Safe Mode --> ``` --- ### ✅ 五、常见命令汇总 | 命令 | 作用 | |------|------| | `hdfs dfsadmin -safemode get` | 查看当前 Safe Mode 状态 | | `hdfs dfsadmin -safemode enter` | 手动进入 Safe Mode | | `hdfs dfsadmin -safemode leave` | 手动退出 Safe Mode | | `hdfs dfsadmin -report` | 查看 DataNode 和块统计信息 | | `jps` | 检查 NameNode 和 DataNode 是否运行 | --- ### ✅ 六、最佳实践建议 | 场景 | 推荐做法 | |------|----------| | 单节点测试环境 | 修改 `dfs.namenode.safemode.threshold-pct=0` | | 多节点集群 | 确保所有 DataNode 正常启动后再操作 | | 生产环境 | 不要手动 `leave`,应排查根本原因 | | 调试问题 | 使用 `-report` 和日志分析 block 缺失情况 | --- ### ✅ 七、总结 > **NameNodeSafe Mode 是保护机制,不是错误**。它防止在数据不完整时进行写操作导致损坏。 | 问题 | 解决方案 | |------|-----------| | 卡在 Safe Mode | 检查 DataNode 是否全部启动 | | 块复制不足 | 增加副本或等待节点恢复 | | 想快速退出 | 测试环境可用 `hdfs dfsadmin -safemode leave` | | 配置不合理 | 调整 `dfs.namenode.safemode.threshold-pct` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值