hadoop之安全模式及SafeModeException

技術小美發表於2017-11-12

問題: hadoop啟動的時候報錯

HTTP ERROR 500 
Problem accessing /nn_browsedfscontent.jsp. Reason: 

Cannot issue delegation token. Name node is in safe mode. 
The reported blocks 0 needs additional 10 blocks to reach the threshold 0.9990 of total blocks 10. 
Safe mode will be turned off automatically 

Caused by: 
org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot issue delegation token. Name node is in safe mode.

理論:
Hadoop的安全模式
在分散式檔案系統啟動的時候,開始的時候會有安全模式,當分散式檔案系統處於安全模式的情況下,檔案系統中的內容不允許修改也不允許刪除,直到安全模式結束。安全模式主要是為了系統啟動的時候檢查各個DataNode上資料塊的有效性,同時根據策略必要的複製或者刪除部分資料塊。執行期通過命令也可以進入安全模式。在實踐過程中,系統啟動的時候去修改和刪除檔案也會有安全模式不允許修改的出錯提示,只需要等待一會兒即可。

在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叢集的一種保護機制,在啟動時,最好是等待叢集自動退出,然後再進行檔案操作。

解決:

方法一:

safemode模式
NameNode在啟動的時候首先進入安全模式,如果datanode丟失的block達到一定的比例(1-dfs.safemode.threshold.pct),則系統會一直處於安全模式狀態即只讀狀態。

hadoop dfsadmin -safemode leave

有兩個方法離開這種安全模式
1. 修改dfs.safemode.threshold.pct為一個比較小的值,預設是0.999。
2. hadoop dfsadmin -safemode leave命令強制離開

方法二:

jps檢視各個節點啟動的程式
hadoop-daemon.sh start XX資源名 XX節點名

檢視日誌(若資源埠被佔用,如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,殺掉這個程式,重啟節點服務即可。

補充:
dfsadmin -safemode value 來操作安全模式,引數value的說明如下:
enter – 進入安全模式
leave – 強制NameNode離開安全模式
get – 返回安全模式是否開啟的資訊
wait – 等待,一直到安全模式結束。

本文轉自 張衝andy 部落格園部落格,原文連結:  http://www.cnblogs.com/andy6/p/7660281.html ,如需轉載請自行聯絡原作者


相關文章