如何在我的 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 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 22 天前