關於HDFS應知應會的N個問題 | 技術點

大資料學習與分享發表於2020-10-30

1. Namenode的安全模式 ?

安全模式是Namenode的一種狀態(Namenode主要有active/standby/safemode三種模式)。

 

2. 哪些情況下,Namenode會進入安全模式 ?

a. Namenode發現叢集中的block丟失率達到一定比例時(預設0.01%),Namenode就會進入安全模式,在安全模式下,客戶端不能對任何資料進行操作,只能檢視後設資料資訊

b. 在hdfs叢集正常冷啟動時,Namenode也會在safemode狀態下維持相當長的一段時間,此時你不需要去理會,等待它自動退出安全模式即可

 

3. 為什麼,在HDFS叢集冷啟動時,Namenode會在安全模式下維持相當長的一段時間 ?

Namenode的記憶體後設資料中,包含檔案路徑、副本數、blockid,及每一個block所在Datanode的資訊,而fsimage中,不包含block所在的Datanode資訊。那麼,當Namenode冷啟動時,此時記憶體中的後設資料只能從fsimage中載入而來,從而就沒有block所在的Datanode資訊 ——> 就會導致Namenode認為所有的block都已經丟失 ——> 進入安全模式 ——> 所在的Datanode資訊啟動後,會定期向Namenode彙報自身所持有的block資訊 ——> 隨著Datanode陸續啟動,從而陸續彙報block資訊,Namenode就會將記憶體後設資料中的block所在Datanode資訊補全更新 ——> 找到了所有block的位置,從而自動退出安全模式

 

4. 如何退出安全模式 ?

1)找到問題所在,進行修復(比如修復當機的所在Datanode資訊補全更新)

2)可以手動強行退出安全模式:hdfs namenode --safemode leave 【不推薦,畢竟沒有真正解決問題】

 

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記憶體

 

7. fsimage是否存放了block所在伺服器資訊 ?

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檔案中移除

 

9. 關於Datanode的幾個問題 ?

1)Datanode在什麼情況下不會備份?

在強制關閉或者非正常斷電時不會備份

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叢集工作狀態命令 ?

hdfs dfsadmin -report:快速定位各個節點情況,如每個節點的硬碟使用情況


關注微信公眾號:大資料學習與分享,獲取更對技術乾貨

相關文章