启动HDFS之后一直处于安全模式 org.apache.hadoop.hdfs.server.namenode.SafeModeException: Log not rolled. Name node is in safe mode.
一.现象
三台机器 crxy99,crxy98,crxy97(crxy99是NameNode+DataNode,crxy98和crxy97是DataNode)
按正常命令启动HDFS之后,HDFS一直处于安全模式(造成启动Hive的时候失败,不能向HDFS上写数据),正常情况下是在启动的前30秒处于安全模式,之后就退出了.
可以采取强制退出安全模式的方式;
安全模式的相关命令:
获取安全模式的状态:
hdfs dfsadmin -safemode get
安全模式打开
hdfs dfsadmin -safemode enter
安全模式关闭
hdfs dfsadmin -safemode leave
二.调查
查看HDFS启动的日志,到HDFS配置的日志对应的目录去查看日志信息:
查看crxy99 NameNode对应的日志信息 关于安全模式的报错信息如下:
2017-08-29 00:30:52,201 DEBUG org.apache.hadoop.ipc.Server: Served: rollEditLog queueTime= 6 procesingTime= 0 exception= SafeModeException
2017-08-29 00:30:52,202 DEBUG org.apache.hadoop.security.UserGroupInformation: PrivilegedActionException as:root (auth:SIMPLE) cause:org.apache.hadoop.hdfs.server.namenode.SafeModeException: Log not rolled. Name node is in safe mode.
The reported blocks 7259 needs additional 83 blocks to reach the threshold 0.9990 of total blocks 7349.
The number of live datanodes 2 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached.
2017-08-29 00:30:52,202 INFO org.apache.hadoop.ipc.Server: IPC Server handler 3 on 9000, call org.apache.hadoop.hdfs.server.protocol.NamenodeProtocol.rollEditLog from 192.168.43.97:54228 Call#1 Retry#0: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Log not rolled. Name node is in safe mode.
The reported blocks 7259 needs additional 83 blocks to reach the threshold 0.9990 of total blocks 7349.
The number of live datanodes 2 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached.
关于 The reported blocks 7259 needs additional 83 blocks to reach the threshold 0.9990 of total blocks 7349. 大体意思是DataNode给NameNode汇报了7259个block块,但是还需要83个block块 才能达到总共所需要的7349个block块的0.99990.
一句话:就是缺少block块.....
在hadoop集群的时候,集群的运行会进入到安全模式(safeMode)下。在安全模式下运行一段时间后,自动退出。
1.那么,系统在安全模式下干什么了?
当集群启动的时候,会首先进入到安全模式。系统在安全模式下,会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication)是5,那么在dataNode上就应该有5个副本存在,假设只存在3个副本,那么比率就是3/5=0.6。
在配置文件hdfs-default.xml中定义了一个最小的副本率,见图7-1
我们的副本率0.6明显小于0.999,因此系统会自动的复制副本到其他dataNode,争取是的最小副本率>=0.999。如果系统中有8个副本,超过我们设定的5个副本,那么系统也会删除多于的3个副本。
2.安全模式对我们有什么影响?
这时,不允许客户端进行任何修改文件的操作,包括上传文件、删除文件、重命名、创建文件夹等操作。比如,创建文件时,在源代码中就有对安全模式的判断,如图7-2
当我们在安全模式下进行修改文件操作时,会报出如下错误.
正常情况下,安全模式会运行一段时间自动退出的。只需要我们稍等一会就可以了。到底等多长时间哪,我们可以通过50070端口查看安全模式退出的剩余时间,如图7-4。
虽然不能进行修改文件的操作,但是可以浏览目录结构、查看文件内容的。
3.我们可以控制是否进入或者退出安全模式吗?
在命令行下是可以控制安全模式的进入、退出和查看的,
命令hadoop fs –safemode get 查看安全模式状态
命令hadoop fs –safemode enter 进入安全模式状态
命令hadoop fs –safemode leave 离开安全模式状态
安全模式,是hadoop集群的一种保护机制,在启动时,最好是等待集群自动退出,然后再进行文件操作。
为什么会少block块呢?
猜测某个DataNode节点没有正常启动,于是jps查看各个节点启动的进程.发现crxy97没有启动,没有DataNode进程.
为什么crxy97没有启动DataNode进程呢?
①先单独尝试启动这个DataNode节点:
hadoop-daemon.sh start datanode crxy97
再在crxy97上查看仍然没有启动DataNode进程.
②去crxy97上的日志中去查看
2017-08-31 08:13:37,890 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain
java.net.BindException: Problem binding to [0.0.0.0:50010] java.net.BindException: Address already in use; For more details see: http://wiki.apache.org/hadoop/B indException
image.png
原因是50010端口被占用了.
③为什么50010端口被占用了,哪个进程占用了?
解决方法:
可以将占用此端口的程序杀掉或是更改hdfs-site.xml中的dfs.datanode.address0.0.0.0:50010
杀掉进程释放端口方法:
1、netstat -tln | grep 50010,查看这个端口使用情况;
2、lsof -i:50010,显示是哪个程序占用此端口
3、kill -9 进程的PID,杀掉这个进程,重启节点服务即可。
经调查发现我crxy97可能是是因为之前安装过CM,创建了一个hdfs用户,只要crxy97机器一启动,就会使用hdfs用户启动一个程序占用50010端口.我采取的方法是去/etc/passwd中删除hdfs用户对应的信息.
然后使用 " userdel hdfs " 这样重新启动crxy97之后 也没有程序占用50010端口, HDFS正常启动之后不再处于一直处于安全模式,问题解决.
参考: hadoop之 安全模式及SafeModeException