1. 程式人生 > >HDFS學習筆記

HDFS學習筆記

HDFS的架構原理

角色

  • NameNode-檔案結構樹儲存節點

Active NameNode-主節點:對外提供服務接收請求。

Standby NameNode-備節點:一是接收和同步主節點的edits log以及執行定期checkpoint,二是在Active NameNode的時候進行主備切換。

  • JournalNode-日誌節點

存放NameNode元資料寫入的editLogs,供Standby NameNode拉取,主要意義是保持Active NameNode和Standby NameNode的同步,但必須高可用,所以是叢集部署。

  • DataNode-資料節點

存放真實資料的節點

  • Block

一份資料會分為多個block存放在各個DataNode上,一個block會建立副本,放入其他的DataNode,保證一個block有三個副本在不同的DataNode上.

上傳一個檔案的流程

  • 客戶端上傳檔案,請求NameNode
  • Active NameNode-主節點在記憶體中修改檔案目錄樹,同時寫入本地的editLog以及向JournalNode叢集傳送editLog,然後返回給客戶端,客戶端接收響應後才把檔案上傳到dataNode叢集。
  • Standby NameNode-備節點從JournalNode叢集拉取editLog,修改自己的檔案目錄樹
  • Standby NameNode 定時在磁碟生成fsimage映象檔案,併合並自己的editLog檔案(這個稱為checkpoint檢查點操作),然後上傳到Active NameNode,Active NameNode收到後清空老的editLog檔案以及fsimage檔案。
  • 若Active NameNode故障,Standby NameNode將從JournalNode讀取全部的editLog,然後切換為Active NameNode(可以保證故障轉移時,目錄樹是完全和原來的ActiveNode同步的),若原來的Active NameNode重啟了,將根據JournalNode同步editLog到最新,恢復時直接根據fsimage檔案以及本地editLog檔案重放命令,進行資料恢復
  • 為什麼需要這套機制:為了加快NameNode重啟後恢復資料的效率(映象恢復速度快,不需要重放所有editLog)。

幾個重要的優化

獲取transactionId以及本地磁碟寫+網路磁碟寫JournalNode的優化

為什麼需要引入transactionId

因為在Active NameNode向JournalNode傳送editLog的時候,必須保證順序。所以需要獲取transacationId來維護這個順序,這也意味著transacationId的獲取不能併發。

原理與流程解析

主要是運用了double-buffer雙緩衝機制,什麼是雙緩衝勒。要傳送的editLog資料是先放在緩衝區裡面,然後再由某個執行緒統一發送到JournalNode,提高網路寫的效率。但這裡有個問題得解決,如何讓在網路寫的過程中不影響資料寫入緩衝區勒?只能引入雙緩衝機制,即將緩衝區域分為兩份,一份用於存放即時寫入的資料,另一份用於存放將要被網路寫的資料,當需要網路寫的時候將兩個區域切換,這樣兩個操作才能互相不影響。

上圖第一次獲取鎖是為了生成transacationId,第二次獲取鎖的操作就是優化網路寫,保證每個請求nameNode的執行緒不做無效的寫入請求。這裡保留一個疑問?第二次獲取鎖應該是非公平鎖把,理論上最後一個transacationId的執行緒獲取到鎖效率會更高一些,HDFS沒有對這裡做優化嗎?文章裡沒有提到這裡更細的解釋,這裡暫時存疑。

大檔案上傳優化

HDFS上傳檔案的流程

  • 比如有人上傳一個1TB的大檔案到網盤,或者是上傳個1TB的大日誌檔案。
  • HDFS客戶端把一個一個的block上傳到對應的第一個DataNode
  • 第一個DataNode會把這個block複製一份,做一個副本傳送給第二個DataNode。
  • 第二個DataNode傳送一個block副本到第三個DataNode。

為什麼需要優化

如果使用傳統的IO傳輸,將會產生頻繁的網路傳輸,效率很低。

優化機制

Chunk緩衝機制

加快磁碟寫入記憶體效率,預設是512Byte。

Packet資料包機制

進一步緩衝要傳送網路的資料,預設64M。

記憶體佇列非同步傳送機制
  • 當一個Packet被塞滿了chunk之後,就會將這個Packet放入一個記憶體佇列來進行排隊。
  • 然後有一個DataStreamer執行緒會不斷的獲取佇列中的Packet資料包,通過網路傳輸直接寫一個Packet資料包給DataNode。

注:這裡是非同步的,意思是往OutPutStream寫入資料的同時,也在DataStreamer執行緒也在傳送資料包。

檔案契約機制

為什麼要有檔案契約

為了保證同一時間只能有一個客戶端獲取NameNode上面一個檔案的契約,然後才可以寫入資料。在寫檔案的過程期間,客戶端需要開啟一個執行緒,不停的傳送請求給NameNode進行檔案續約。

優化機制

NameNode如果每次都遍歷NameNode去淘汰過期的契約,效率是非常低下的,這裡的優化就是對每個契約按最近一次續約時間進行排,序每次都把續約時間最老的契約排在最前頭。當每次檢查是否過期時,從頭開始遍歷,只要遍歷到沒有過期的就不遍歷了,因為後面的必定沒有過期。類似的,運用這種方式優化的案例還有eureka維護服務例項心跳續