2026-10-31·by 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。

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →

safe-mode — Sijie Wang