如何在我的 Amazon EMR 集群上关闭 NameNode 服务的安全模式?

上次更新日期:2022 年 12 月 23 日

当我尝试在 Amazon EMR 集群上运行 Apache Hadoop 或 Apache Spark 作业时,NameNode 服务会进入安全模式。我尝试关闭安全模式,但它立即重新开启。我想让 NameNode 脱离安全模式。

简短描述

在 Amazon EMR 集群上运行 Apache Hadoop 或 Apache Spark 作业时,您可能会收到以下错误消息之一:

“Cannot create file/user/test.txt._COPYING_.Name node is in safe mode.”(无法创建 file/user/test.txt._COPYING_。名称节点处于安全模式。)

“org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /user/hadoop/.sparkStaging/application_15xxxxxxxx_0001.Name node is in safe mode.该模式已手动开启。Use "hdfs dfsadmin -safemode leave" to turn safe mode off.NamenodeHostName:ip-xxx-xx-xx-xx.ec2.internal”(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)

对于 Hadoop Distributed File System(HDFS)集群来说,NameNode 的安全模式是只读模式。在安全模式下,您无法对文件系统或数据块进行任何修改。在 DataNodes 报告大多数文件系统数据块可用后,NameNode 会自动退出安全模式。但是,由于以下原因,NameNode 可能会进入安全模式:

  • 可用空间小于 NameNode 存储目录所需的空间量。在参数 dfs.namenode.resource.du.reserved 中定义了 NameNode 目录所需的空间量。
  • NameNode 无法将 FsImageEditLog 加载到内存中。
  • NameNode 没有收到来自 DataNode 的数据块报告。
  • 集群中的某些节点可能已关闭。这使得这些节点上的数据块不可用。
  • 某些数据块可能已损坏。

在 NameNode 日志位置 /var/log/hadoop-hdfs/ 中查找问题的根本原因。

解决方法

在离开安全模式之前,请确认您知道并理解为什么 NameNode 卡在安全模式下。查看所有 DataNode 和 NameNode 日志的状态。

重要提示:在某些情况下,手动关闭安全模式可能会导致数据丢失。

要手动关闭安全模式,请运行以下命令:

sudo -u hdfs hadoop dfsadmin -safemode leave

根据错误的根本原因,请完成以下一个或多个问题排查步骤以关闭安全模式。

切换到具有多个主节点的集群

在具有单个主节点的集群中,不会自动执行检查点操作。这意味着 HDFS 编辑日志不会备份到新快照(FsImage)并删除。HDFS 使用编辑日志记录快照之间的文件系统更改。最佳实践是从具有单个主节点的集群中手动删除编辑日志。如果您不手动删除编辑日志,则日志可能会占用 /mnt 中的所有磁盘空间。要解决此问题,请启动具有多个主节点的集群。具有多个主节点的集群支持 HDFS NameNode 的高可用性。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 中删除不必要的文件。

在具有一个主节点的集群上,如果 in/mnt/namenode/current 目录使用了大量空间,则创建新的快照(FsImage)。然后,删除旧的编辑日志。

例如,您运行一个脚本,执行以下操作:
生成新快照。
将旧的编辑日志备份到 Amazon Simple Storage Service(Amazon S3)存储桶。
删除编辑日志。

示例脚本:

#!/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

检查数据块或文件是否损坏或丢失

1.    运行以下命令以查看可帮助您检查集群运行状况的报告。该报告还为您提供复制不足的数据块的百分比和缺失副本的数量。

hdfs fsck /

2.    对于列表中的每个文件,请运行以下命令以找到该文件每个数据块的 DataNode:

hdfs fsck example_file_name -locations -blocks -files

注意:请将 example_file_name 替换为您的文件名。

您看到的消息会类似于以下消息:

0. BP-762523015-192.168.0.2-1480061879099:blk_1073741830_1006 len=134217728 MISSING!
1. BP-762523015-192.168.0.2-1480061879099:blk_1073741831_1007 len=134217728 MISSING!
2. BP-762523015-192.168.0.2-1480061879099:blk_1073741832_1008 len=70846464 MISSING!

从前述的消息中,您可以找到存储数据块的 DataNode。例如,“192.168.0.2.” 然后,您可以查看来自该 DataNode 的日志,搜索与数据块 ID(blk_xxx)相关的错误。节点经常被终止,导致数据块丢失。

3.    要删除损坏的文件,请退出安全模式。然后,运行以下命令:

hdfs dfs -rm example_file_name

注意:请将 example_file_name 替换为您的文件名。

使用 CloudWatch 指标监控 HDFS 的运行状况

以下 Amazon CloudWatch 指标可以帮助监控 NameNode 进入安全模式的潜在原因:

  • HDFSUtilization:正在使用的 HDFS 存储的百分比。
  • MissingBlocks:HDFS 没有副本的数据块的数量。这些可能是损坏的数据块。
  • UnderReplicatedBlocks:必须复制一次或多次的数据块的数量。

HDFS 用户指南(来自 Apache Hadoop 网站)

这篇文章对您有帮助吗?


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