1. 程式人生 > >大資料Hadoopx之HDFS模組中那些你可能不知道的小知識!

大資料Hadoopx之HDFS模組中那些你可能不知道的小知識!

再給大家分享一些小知識,一起來瞧瞧吧!

一、namenode & secondarynamenode 
 
1)namenode啟動(namenode格式化時會建立fsimage,edits兩個檔案,如果不是第一次啟動,會直接載入這兩個檔案到記憶體)。  
2)secondarynamenode向namenode發出請求執行checkpoint(預設是一個小時請求執行一次,或者操作達到一百萬次請求執行一次)  
3) namenode滾動正在寫的edits日誌,將滾動前的fsimage和edits拷貝給secondarynamenode,secondarynamenode將其讀取到記憶體,併合並生成新的fsimage.chkpoint拷貝到namenode,namenode將fsimage.chkpoint重新命名為fsimage。

  二、fsimage & edits(在namenode格式化之後${namenode.dir}/dfs/name/current下)
    
  1)fsimage:是用來儲存hdfs檔案系統元資料資訊的永久性檢查點,包括hdfs所有目錄和檔案idnode的序列化資訊。  
  2)edits:存放hdfs所有更新操作的路徑,client寫操作會首先記錄到edits中。  
  3)seen_txid: 儲存的是最後一個edits檔名_後的數字。  
  4)namenode每次啟動都會將fsimage讀取到記憶體,並從000001到seen_txid記錄的數字依次執行每個edits中的更新操作,保證記憶體中的資料是最新,同步的。  
  5)  檢視fsimage && edits    
       i)檢視fsimage : hdfs oiv -p 檔案型別 -i 映象檔案 -o 轉換後文件輸出路徑。    
       ii) 檢視edits: hdfs oev -p 檔案型別 -i 映象檔案 -o 轉換後文件輸出路徑。

三、 namenode故障處理方法 
 
1)將secondarynamenode中的資料拷貝到namenode儲存資料的目錄。

    i)   kill -9 namenode程序。    
    ii)刪除${namenode.dir}/dfs/name下的所有檔案。    
    iii)將{secondary.dir}/dfs/namesecondary/下的所有資料 拷貝到 ./name下。重啟namenode。 
  

2)利用 -importCheckpoint選項啟動namenode守護程序,從而將secondarynamenode中的資料拷貝到namenode上

i)kill -9 namenode程序,並刪除namenode上的資料檔案。    
ii)將secondary上的namesecondary資料夾拷貝到namenode節點的name資料夾同級目錄下,並刪除 in_use.lock檔案。    
iii)匯入檢查點資料(等待一會,ctrl+c結束程序)bin/hdfs namenode -importCheckpoint,並啟動namenode。

四、 namenode && datanode多目錄配置(好處:增加可靠性)
i) 刪除data/和logs/下的所有檔案。
ii) 重啟叢集並格式化 namenode

五、 datanode工作機制
1)一個block在datanode上以檔案形式儲存,包括兩個檔案,一個是資料本身,一個是包括資料塊長度,快資料的校驗和,以及時間戳。  
2)datanode啟動後向 namenode註冊,週期性(1小時)的向namenode 上報所有的塊資訊。  
3)心跳每3秒一次,返回namenode給該datanode的命令。如果超過10分鐘沒有收到某個datanode的心跳,認為節點不可用。  
4)叢集執行中可以安全 增加和刪除節點。

六、資料完整性 
當datanode週期性讀取block時,會計算checksum,如果計算的checksum和當初建立時值不一樣,說明block已經損壞,client會讀取其他節點的bolck。

七、掉線時限 引數設定  
datanode程序死亡或者節點故障導致無法與namenode進行通訊時,要經過一段時間才被namenode判定為死亡,這段時間叫 超時時長。
hdfs的預設超時時長時10分鐘30秒。計算公式為 : timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

八、 動態增加節點    
1)進行ssh免密設定    
2)在$HADOOP_HOME/etc/haoop/下新建 dfs.hosts檔案,並將叢集各主機名新增進去。    
3)修改hdfs-site.xml      
4) 更新resourcemanage節點,yarn rmadmin -refreshNodes    
5)在namanode所在節點修改slaves檔案,增加新增節點的主機名,    
6)在新增主機上單獨啟動,sbin/hadoop-daemon.sh start datanode,sbin/yarn-daemon.sh start nodemanager,web端檢查是否成功。    
7)如果資料不均衡,可以用 ./start-balancer.sh 命令實現叢集的再平衡。

九、動態刪除節點    
1)在namenode所在節點的 ${HADOOP_HOEM}/etc/hadoop/新建 dfs.hosts.exclude 檔案,並新增準備刪除節點的主機名稱。    
2) 修改hdfs-site.xml檔案,增加如下屬性,
並重新整理namenode:hdfs dfsadmin -refreshNodes,
重新整理resourcemanage:yarn rmadmin -refreshNodes      
3)web端檢查節點,退役節點的狀態為 decommission in progress(退役中),說明資料節點正在複製塊到其他節點,等待退役節點狀態為 decommissioned(所有塊已經複製完成),停止該節點及節點資源管理器。注意:如果副本數是 3,服役的節點小於等於 3,是不能退役成功的,需要修改副本數後才能退役。    
4)從 namenode 的 dfs.hosts 檔案中刪除退役節點 主機名,並重新整理namenode,重新整理resourcemanage。    
5)從namenode所在節點刪除slave檔案中的已刪除節點的主機名,如果資料不均衡,執行 sbin/start-balancer.sh,使叢集重新平衡。

十、HDFS HA高可用機制    
1)實現HDFS的高可用關鍵性策略是通過雙namenode消除單點故障。    
2)每個namenode各儲存一份元資料資訊,edits檔案儲存在共享儲存中管理(qjournal 和NFS兩個主流實現),只有active namenode節點可以寫入edits檔案。    
3)每個namenode由zkFailover監管以及狀態切換。    
4)兩個namenode節點必須做ssh免密登入,且同時只能有一個namenode對外提供服務。    
5)HA中zookeeper的作用:      
i)故障檢測:叢集中的每個namenode在zookeeper中維持了一個持久會話,如果機器崩潰,會話將終止,zookeeper通知另一個namenode觸發故障轉移。      
ii)選擇現役namenode。    
6)HA中ZKFC的作用:ZKFC是zookeeper的客戶端,也監視和管理namenode的狀態,每個namenode節點也執行一個zkfc程序,負責:      
i)健康檢測:zkfc使用一個健康檢查命令ping與自己在同一主機的namenode,根據namenode回覆的狀態確定namenode是否是健康的。      
ii)zookeeper會話管理:當本機namenode是健康的,zkfc保持一個在zookeeper中開啟的會話,如果namenode是active,zkfc也保持一個特殊的znode鎖,該鎖使用了zookeeper對短暫節點的支援,如果會話結束,鎖節點將自動刪除。      
iii)基於zookeeper的選擇:如果本機的namenode是健康的,且zkfc沒有發現其他節點當前持有znode鎖,它將為自己獲取該鎖。若成功,它就贏得了選擇,並負責執行故障轉移程序為自己主機的namenode標記為active。    
7)HA-HDFS故障轉移機制      
i)zkfc發現本機的namenode發生假死,會向另一臺namenode上的zkfc程序發出訊號,另一臺namenode的akfc會ssh kill -9 發生假死的namenode程序(如果沒有殺死,可以呼叫使用者自定義的指令碼程式)。      
ii)zkfc會啟用本機的namenode,並標記為active,讀取qjournal中的edits檔案,管理叢集。
好了,本篇的內容到此已經分享完畢了,下篇將會給大家分享一下如何用 Java程式碼操作HDFS上的資料,如果你覺得對你有所幫助,還請動動你的手指,分享一下,謝謝!!!