安全模式是Namenode的一種狀態(Namenode主要有active/standby/safemode三種模式)。shell
2. 哪些狀況下,Namenode會進入安全模式 ?安全
a. Namenode發現集羣中的block丟失率達到必定比例時(默認0.01%),Namenode就會進入安全模式,在安全模式下,客戶端不能對任何數據進行操做,只能查看元數據信息服務器
b. 在hdfs集羣正常冷啓動時,Namenode也會在safemode狀態下維持至關長的一段時間,此時你不須要去理會,等待它自動退出安全模式便可微信
3. 爲何,在HDFS集羣冷啓動時,Namenode會在安全模式下維持至關長的一段時間 ?ssh
Namenode的內存元數據中,包含文件路徑、副本數、blockid,及每個block所在Datanode的信息,而fsimage中,不包含block所在的Datanode信息。那麼,當Namenode冷啓動時,此時內存中的元數據只能從fsimage中加載而來,從而就沒有block所在的Datanode信息 ——> 就會致使Namenode認爲全部的block都已經丟失 ——> 進入安全模式 ——> 所在的Datanode信息啓動後,會按期向Namenode彙報自身所持有的block信息 ——> 隨着Datanode陸續啓動,從而陸續彙報block信息,Namenode就會將內存元數據中的block所在Datanode信息補全更新 ——> 找到了全部block的位置,從而自動退出安全模式oop
4. 如何退出安全模式 ?學習
1)找到問題所在,進行修復(好比修復宕機的所在Datanode信息補全更新)大數據
2)能夠手動強行退出安全模式:hdfs namenode --safemode leave 【不推薦,畢竟沒有真正解決問題】spa
5. Namenode服務器的磁盤故障致使namenode宕機,如何挽救集羣及數據 ?
1)HA機制:高可用hadoop2.0
2)配置hdfs-site.xml指定而後重啓Namenode運行時數據存放多個磁盤位置
3)而後重啓Namenode和SecondaryNamenode的工做目錄存儲結構徹底相同,固然後重啓Namenode故障退出須要從新恢復時,能夠從SecondaryNamenode的工做目錄存儲結構徹底相同,當的工做目錄中的namesecondary文件夾及其中文件拷貝到而後重啓Namenode所在節點工做目錄中(但只能恢復大部分數據SecondaryNamenode最後一次合併以後的更新操做的元數據將會丟失),將namesecondary重命名爲name而後重啓Namenode
6. Namenode是否能夠有多個?Namenode跟集羣數據存儲能力有關係嗎?
1)非HA的模式下Namenode只能有一個,HA模式下能夠有兩個(一主active一備standby),HDFS聯邦機制能夠有多個Namenode
2)關係不大,存儲數據由Datanode完成。可是藥儘可能避免存儲大量小文件,由於會耗費Namenode內存
1)在edits中保存着每一個文件的操做詳細信息
2)在fsimage中保存着文件的名字、id、分塊、大小等信息,可是不保存Datanode 的IP
3)在hdfs啓動時處於安全模式,Datanode 向Namenode彙報本身的IP和持有的block信息
安全模式結束,文件塊和Datanode 的IP關聯上
驗證過程: 1) 啓動Namenode,離開safemode,cat某個文件,看log,沒有顯示文件關聯的Datanode 2) 啓動Datanode,cat文件,內容顯示 3) 中止Datanode ,cat文件,看log,看不到文件,但顯示了文件塊關聯的Datanode |
8. Datanode動態上下線?
在實際生產環境中,在hdfs-site.xml文件中還會配置以下兩個參數:
dfs.hosts:白名單;dfs.hosts.exclude:黑名單
<property> <name>dfs.hosts</name> #完整的文件路徑:列出了容許連入NameNode的datanode清單(IP或者機器名) <value>$HADOOP_HOME/conf/hdfs_include</value> </property> <property> <name>dfs.hosts.exclude</name> #文件完整路徑:列出了禁止連入NameNode的datanode清單(IP或者機器名) <value>$HADOOP_HOME/conf/hdfs_exclude</value> </property> |
1) 上線datanode
a) 保證上線的datanode的ip配置在白名單而且不出如今黑名單中
b) 配置成功上線的datanode後,經過命令hadoop-daemon.sh datanode start啓動
c) 刷新節點狀態:/bin/hadoop dfsadmin -refreshNodes(這個命令能夠動態刷新dfs.hosts和dfs.hosts.exclude配置,無需重啓NameNode)
d) 手動進行數據均衡:start-balance.sh
2) 下線datanode
a) 保證下線的datanode的ip配置在黑名單而且不出如今白名單中
b) 關閉下線的節點
c) 刷新節點狀態:/bin/hadoop dfsadmin -refreshNodes
d) 機器下線完畢後,將它們從hdfs_exclude文件中移除
在強制關閉或者非正常斷電時不會備份
2)3個Datanode中有一個Datanode出現錯誤會怎樣?
這個Datanode的數據會在其餘的Datanode上從新作備份
10. HDFS HA機制下的腦裂現象以及避免方法 ?
當standby Namenode的ZKFailoverController收到active Namenode端故障通知時,不會當即將本身的狀態切換爲active,由於此時active Namenode可能處於「假死」狀態,若是即刻切換爲active狀態,有可能形成腦裂現象。
爲了防止腦裂,建議寫個腳本確保發出故障通知的active Namenode必定被kill掉,具體能夠按照如下幾個步驟完成kill操做:
1.執行殺掉active Namenode的shell腳本,等待ssh kill返回命令
2.若是響應成功,就把原standby Namenode的狀態切換爲active;若是響應失敗或者超時(能夠配置一個超時時間)
3.只要shell腳本的調用返回值爲true,則切換本身端的Namenode狀態爲active
筆者強調:Namenode主備切換、健康狀態監控等須要經過ZKFailoverController等組件實現,但最終會藉助於zookeeper集羣
11. HDFS爲何不適合存儲小文件 ?
通常一個block對應的元數據大小爲150byte左右,大量小文件會使內存中的元數據變大致使佔用大量Namenode內存、尋址時間長
12. 大量小文件的處理方式?
1)打成HAR files
命令:hadoop archive -archiveName xxx.har -p /src /dest
查看內容:hadoop fs -lsr har:///dest/xxx.har
該命令底層其實是運行了一個MapReduce任務來將小文件打包成HAR。可是經過HAR來讀取一個文件並不會比直接從HDFS中讀取文件高效,由於對每個HAR文件的訪問都須要進行index文件和文件自己數據的讀取。而且雖然HAR文件能夠被用來做爲MapReduce任務的input,可是並不能將HAR文件中打包的文件看成一個HDFS文件處理
2)編寫MR程序,將小文件序列化到一個Sequence File中
將小文件以文件名做爲key,以文件內容做爲value,編寫一個程序將它們序列化到HDFS上的一個Sequence File中,而後來處理這個Sequence File。相對打成HAR文件,具備兩個優點:
(1)Sequence File是可拆分的,所以MapReduce能夠將它們分紅塊並獨立地對每一個塊進行操做
(2)它們同時支持壓縮,不像HAR。在大多數狀況下,塊壓縮是最好的選擇,由於它將壓縮幾個記錄爲一個塊,而不是一個記錄壓縮一個塊
筆者強調hdfs小文件問題要結合具體的處理引擎以及業務狀況等,好比離線處理下、流式處理下小文件問題如何解決,以後筆者會開單篇詳述
13. 查看HDFS集羣工做狀態命令 ?
關注微信公衆號:大數據學習與分享,獲取更對技術乾貨