如何在我的 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 无法将 FsImageEditLog 加载到内存中。
  • 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,则执行以下一项或多项操作:

删除更多文件

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 文档

这篇文章对您有帮助吗?


您是否需要账单或技术支持?