如何在我的 Amazon EMR 集群上关闭 NameNode 服务的安全模式?
上次更新时间:2021 年 9 月 3 日
尝试在 Amazon EMR 集群上运行 Apache Hadoop 或 Apache Spark 作业时,我会收到以下错误消息之一:
- 无法创建 file/user/test.txt。_COPYING_。名称节点处于安全模式。
- org.apache.hadoop.hdfs.server.namenode.SafeModeException: 无法删除 /user/hadoop/.sparkStaging/application_15xxxxxxxx_0001。名称节点处于安全模式。该模式已手动开启。使用“hdfs dfsadmin -safemode leave”关闭安全模式。NamenodeHostName:ip-xxx-xx-xx-xx.ec2.internal
我尝试关闭安全模式,但它立即重新开启。我想让 NameNode 脱离安全模式。
简短描述
对于 Hadoop 分布式文件系统 (HDFS) 集群来说,NameNode 的安全模式本质上是只读模式。NameNode 可能出于不同的原因进入安全模式,例如以下原因:
- 可用空间小于 NameNode 存储目录所需的空间量。在参数 dfs.namenode.resource .du.reserved 中定义 NameNode 目录所需的空间量。
- NameNode 无法将 FsImage 和 EditLog 加载到内存中。
- NameNode 没有收到来自 DataNode 的阻止报告。
查看 NameNode 日志以在日志位置 /var/log/hadoop-hdfs/ 找出问题的根本原因。
解决方法
根据您的使用案例尝试以下一个或多个故障排除选项。
切换到具有多个主节点的集群
在具有单个主节点的集群中,不会自动执行检查点操作。这意味着 HDFS 编辑日志不会备份到新快照 (FsImage) 并删除。HDFS 使用编辑日志记录快照之间的文件系统更改。如果您的集群具有单个主节点,但您没有手动删除编辑日志,则这些日志最终可以使用每个主节点的所有磁盘空间。要解决此问题,请启动具有多个主节点的集群。具有多个主节点的集群支持 HDFS NameNode 的高可用性,这就解决了检查点问题。有关详细信息,请参阅计划和配置主节点。
从 /mnt 中移除不必要的文件
/mnt 的最小可用磁盘空间由 dfs.namenode.resource.du.reserved 参数指定。当 /mnt 目录中的可用磁盘数量降至低于 dfs.namenode.resource.du.reserved 中设置的值时,NameNode 进入安全模式。dfs.namenode.resource.du.reserved 的默认值为 100 MB。当 NameNode 处于安全模式时,不允许修改文件系统或数据块。因此,从 /mnt 中删除不必要的文件可能有助于解决问题。要删除不再需要的文件,请执行以下操作:
1. 使用 SSH 连接到主节点。
2. 要验证 NameNode 是否由于磁盘空间不足而处于安全模式,请检查 NameNode 日志。这些日志位于 /var/log/hadoop-hdfs 中。如果磁盘空间充足,日志可能类似于以下内容:
2020-08-28 19:14:43,540 WARN org.apache.hadoop.hdfs.server.namenode.NameNodeResourceChecker (org.apache.hadoop.hdfs.server.namenode.FSNamesystem$NameNodeResourceMonitor@5baaae4c): Space available on volume '/dev/xvdb2' is 76546048, which is below the configured reserved amount 104857600
如果磁盘空间不足,日志可能类似于以下内容:
2020-09-28 19:14:43,540 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem (org.apache.hadoop.hdfs.server.namenode.FSNamesystem$NameNodeResourceMonitor@5baaae4c): NameNode low on available disk space. Already in safe mode.
3. 通过运行以下命令确认 NameNode 仍处于安全模式:
[root@ip-xxx-xx-xx-xxx mnt]# hdfs dfsadmin -safemode get
Safe mode is ON
4. 从 /mnt 中删除不必要的文件。例如,在具有一个主节点的集群上,如果 /mnt/namenode/current 中的目录使用了大量空间,则可以创建一个新的快照 (FsImage),然后删除旧的编辑日志。
以下示例脚本生成新快照,将旧的编辑日志备份到 Amazon Simple Storage Service (Amazon S3) 存储桶,然后删除编辑日志。脚本不会删除正在进行的编辑的日志。以 hadoop 用户身份运行以下脚本:
#!/bin/bash
hdfs dfsadmin -safemode enter
hdfs dfsadmin -saveNamespace
sudo su - root -c "hdfs dfs -put /mnt/namenode/current/*edits_[0-9]* s3://doc-example-bucket/backup-hdfs/"
sudo su - root -c "rm -f /mnt/namenode/current/*edits_[0-9]*"
sudo su - root -c "rm -f /mnt/namenode/current/seen*"
hdfs dfsadmin -safemode leave
5. 验证 /mnt 中的可用磁盘空间量。如果可用空间超过 100 MB,请再次检查安全模式的状态,然后关闭安全模式:
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode get
Safe mode is ON
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
如果 /mnt 的可用空间仍然少于 100 MB,则执行以下一项或多项操作:
- 按照以下部分中的说明删除更多文件。
- 增加 /mnt 卷的大小。
删除更多文件
1. 使用 SSH 连接到主节点。
2. 导航到 /mnt 目录:
cd /mnt
3. 确定哪些文件夹使用最多的磁盘空间:
sudo du -hsx * | sort -rh | head -10
4. 继续调查,直到找到磁盘空间问题的根源。例如,如果 var 文件夹使用了大量磁盘空间,请检查 var 中最大的子文件夹:
cd var
sudo du -hsx * | sort -rh | head -10
5. 确定哪个文件/文件夹占用磁盘空间后,选择删除这些文件。确保只删除不再需要的文件。/mnt/var/log/hadoop-hdfs/ 和 /mnt/var/log/hadoop-yarn/ 中已备份到 Amazon S3 日志记录存储桶中的压缩日志文件非常适合删除。
6. 删除不必要的文件后,再次检查安全模式状态,然后关闭安全模式:
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode get
Safe mode is ON
[hadoop@ip-xxx-xx-xx-xxx ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
相关信息
HDFS 用户指南的 Hadoop 文档