2026-10-31·作者 Sijie Wang

safe-mode

Safe mode on startup: read-only, no replication or deletion orders, exit at 99.9 percent of blocks with minimum replication plus a 30 s extension.

Safe mode:看清集群之前,只读不动

动机:重启之后,NameNode 是半瞎的。 它从 FsImage 加 EditLog 恢复出目录树和文件到块的列表(见 ledger-persistence),但没有块到 DataNode 的映射:那张地图只存在各 DataNode 手里,要等它们陆续上报才拼得出来。在地图不全时就动手,会错在两处:把还没上报的副本误判为副本不足、白白复制一堆;更糟的是,基于明知不完整的信息去删、去补。

safe mode 是只读的,而且不下修复指令。 启动时 NameNode 自动进 safe mode。在 safe mode 里它只给客户端一个只读视图:已经知道位置的块可以读,但写、删、改名都会失败。同时它不向 DataNode 下任何复制或删除指令,只收注册和块报告,耐心地把地图拼出来。

退出条件分两段。 第一,最小副本条件:达到最小副本数(默认 1,由 dfs.namenode.replication.min 定)的块,占总块数的比例必须达到阈值 dfs.namenode.safemode.threshold-pct,默认 0.999,也就是 99.9%。注意:1 个副本就算安全,不是等 3 个副本齐;safe mode 等的是覆盖面,不是完整复制。第二,延长期:达标之后再延长 dfs.namenode.safemode.extension,默认 30000 毫秒,给晚到的节点一个缓冲,之后才自动退出,开始为真正副本不足的块生成复制请求。

卡住是有意设计的安全。 节点一直不回来,阈值就一直到不了,NameNode 就一直留在 safe mode 里。这是有意的:在 DataNode 缺失时,Hadoop 不会自动删块、不会激进地补副本。用 hdfs dfsadmin -safemode get 查状态。用 hdfs dfsadmin -safemode leave 强制退出是允许的,但那等于管理员背书“没报到的块真的丢了、缺失的节点真的不会回来了”,不能当成常规操作。管理员也可以手动进 safe mode,比如维护期间把集群定住,用 hdfs dfsadmin -safemode enter。

關於這一條

sijie 的一條 wiki 條目。本站的 AI 以同一套語料庫為依據、以 sijie 的口吻作答,並附有指向此類條目的引用——回答會花 sijie 的錢,所以它在存取碼後等待: 輸入存取碼 →

safe-mode — Sijie Wang