一.現象
三台機器 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塊.....
關於這個錯誤和安全模式的介紹推薦看一個帖子:http://www.superwu.cn/2013/08/23/548/
部分內容如下:
在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

原因是50010端口被占用了.
③為什么50010端口被占用了,哪個進程占用了?
解決方法: 可以將占用此端口的程序殺掉或是更改hdfs-site.xml中的<name>dfs.datanode.address</name><value>0.0.0.0:50010</value> 殺掉進程釋放端口方法: 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正常啟動之后不再處於一直處於安全模式,問題解決.
