Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在我的 Amazon EMR 集群上关闭 NameNode 服务的安全模式?
当我尝试在 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 无法将 FsImage 和 EditLog 加载到内存中。
- 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,请执行以下一项或多项操作:
- 删除更多文件。
- 增加 /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
检查数据块或文件是否损坏或丢失
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 网站)
- 语言
- 中文 (简体)

相关内容
AWS 官方已更新 3 年前