解决单机 hadoop SafeModeException 异常:Cannot create file xxxxxx. Name node is in safe mode

本文介绍了一种在Hadoop单机环境下遇到的安全模式异常情况,导致无法上传文件的问题及解决办法。通过分析异常日志,发现Hadoop处于安全模式,从而阻止了文件的创建。最终通过使用命令解除安全模式解决了问题。

1 问题说明

单机 hadoop 运行环境,Java 服务调用上传文件到 hadoop 时报错,异常日志如下

org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create file/partFile/c38b1b95e511960d150898dfbc76d4bf/0. Name node is in safe mode.
The reported blocks 0 needs additional 18 blocks to reach the threshold 0.9990 of total blocks 19.
The number of live datanodes 1 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached. NamenodeHostName:localhost
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.newSafemodeException(FSNamesystem.java:1407)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkNameNodeSafeMode(FSNamesystem.java:1395)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2280)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2225)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:728)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.create(ClientNamenodeProtocolServerSideTranslatorPB.java:413)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:447)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:989)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:850)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:793)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1844)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2489)

	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:121)
	at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:88)
	at org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:270)
	at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1274)
	at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1216)
	at org.apache.hadoop.hdfs.DistributedFileSystem$8.doCall(DistributedFileSystem.java:473)
	at org.apache.hadoop.hdfs.DistributedFileSystem$8.doCall(DistributedFileSystem.java:470
当您在使用 Hadoop 集群时遇到 `PriviledgedActionException` 错误,提示 `SafeModeException: Cannot create directory /tmp. Name node is in safe mode.` 这表示名称节点(NameNode)正处于安全模式(safe mode)。在这种状态下,HDFS 系统不允许对文件系统进行修改操作(例如创建目录、删除文件等),只能执行读取操作。 ### 安全模式的作用 安全模式是一种保护机制,在集群启动初期或者检测到数据块副本不足的情况下启用。它会暂时冻结文件系统的写入功能,以便完成必要的健康检查或修复工作,比如平衡数据块分布、等待丢失的 DataNodes 回归等。 ### 解决方案 1. **手动离开安全模式** 如果确认集群已经稳定运行,并不需要额外的安全措施,则可以直接通过以下命令让 NameNode 退出安全模式: ```bash hdfs dfsadmin -safemode leave ``` 执行完这条指令后,如果一切正常的话,就可以开始正常的写入操作了。 2. **查看当前状态** 在采取行动前,先查询一下 NameNode 是否真的处于安全模式以及更多详细信息: ```bash hdfs dfsadmin -safemode get ``` 3. **调整阈值参数(非推荐)** 默认情况下,HDFS 会在达到一定比例的数据块恢复后自动退出安全模式。如果您希望改变这一标准,可以在 `hdfs-site.xml` 中调节相关配置项,但这通常并不建议新手轻易尝试。 相关配置示例: ```xml <property> <name>dfs.safemode.threshold.pct</name> <value>0.999f</value> <!-- 设置百分比 --> </property> <property> <name>dfs.safemode.min.datanodes</name> <value>3</value> <!-- 最小DataNode数 --> </property> ``` 4. **重启服务**(最后的办法) 若上述方法均无效,您可以考虑停止并重新启动整个 Hadoop 服务链路,不过在此之前一定要做好充分准备以防万一发生不可逆损失风险事件的发生概率降到最低限度范围内为止才行啊朋友们! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值