1. 程式人生 > >namenode單節點解決方案

namenode單節點解決方案

 

 

架構

NameNode:分散式檔案系統中的管理者,主要負責管理檔案系統的名稱空間、叢集配置資訊和儲存塊的複製等。NameNode會將檔案系統的Meta-data儲存在記憶體中,這些資訊主要包括了檔案資訊、每一個檔案對應的檔案塊的資訊和每一個檔案塊在DataNode的資訊等。

SecondaryNameNode:合併fsimage和fsedits然後再發給namenode。

DataNode:是檔案儲存的基本單元,它將Block儲存在本地檔案系統中,儲存了Block的Meta-data同時週期性地將所有存在的Block資訊傳送給NameNode。

Client

:就是需要獲取分散式檔案系統檔案的應用程式。

fsimage:元資料映象檔案(檔案系統的目錄樹。)

edits:元資料的操作日誌(針對檔案系統做的修改操作記錄)

NameNode、DataNode和Client之間通訊方式:

client和namenode之間是通過rpc通訊;

datanode和namenode之間是通過rpc通訊;

client和datanode之間是通過簡單的socket通訊。

Client讀取HDFS中資料的流程

1. 客戶端通過呼叫FileSystem物件的open()方法開啟希望讀取的檔案。

2. DistributedFileSystem通過使用RPC來呼叫namenode,以確定檔案起始塊的位置。[注1]

3. Client對輸入流呼叫read()方法。

4. 儲存著檔案起始塊的natanoe地址的DFSInputStream[注2]隨即連結距離最近的datanode。通過對資料流反覆呼叫read()方法,可以將資料從datanode傳輸到Client。[注3]

5. 到達快的末端時,DFSInputStream會關閉與該datanode的連線,然後尋找下一個快遞最佳datanode。

6. Client讀取資料是按照卡開DFSInputStream與datanode新建連線的順序讀取的。它需要詢問namenode來檢索下一批所需要的datanode的位置。一旦完成讀取,呼叫FSDataInputStream呼叫close()方法。

[注1]:對於每一個塊,namenode返回存在該塊副本的datanode地址。這些datanode根據他們於客戶端的距離來排序,如果客戶端本身就是一個datanode,並儲存有響應資料塊的一個副本時,該節點從本地datanode中讀取資料。

[注2]:Di是tribute File System類返回一個FSDataInputStream物件給Client並讀取資料。FSDataInputStream類轉而封裝DFSInputStream物件,該物件管理datanode和namenode的I/O。

[注3]:如果DFSInputStream在與datanode通訊時遇到錯誤,它便會嘗試從這個塊的另外一個最臨近datanode讀取資料。它也會記住哪個故障的natanode,以保證以後不回反覆讀取該節點上後續的塊。DFSInputStream也會通過校驗和確認從datanode發來的資料是否完整。如果發現一個損壞的塊,它就會在DFSinputStream檢視從其他datanode讀取一個塊的副本之前通知namenode。

 

 

 

1. Client呼叫DistributedFileSystem物件的create()方法,建立一個檔案輸出流

2. DistributedFileSystem對namenode建立一個RPC呼叫,在檔案系統的名稱空間中建立一個新檔案。

3. Namenode執行各種不同的檢查以確保這個檔案不存在,並且客戶端有建立該檔案的許可權。如果這些檢查均通過,namenode就會為建立新檔案記錄一條記錄,否則,檔案建立失敗,向Client丟擲IOException,DistributedFileSystem向Client返回一個FSDataOutputStream隊形,Client可以開始寫入資料。

4. DFSOutputStream將它分成一個個的資料包,並寫入內部佇列。DataStreamer處理資料佇列,它的責任時根據datanode列表來要求namenode分配適合新塊來儲存資料備份。這一組datanode構成一個管線---我們假設副本數為3,管路中有3個節點,DataStreamer將資料包流式床書到管線中第一個datanode,該dananode儲存資料包並將它傳送到管線中的第二個datanode,同樣地,第二個datanode儲存該資料包並且傳送給管縣中的第3個。

5. DFSOutputStream也維護著一個內部資料包佇列來等待datanode的收到確認回執(ack queue)。當收到管道中所有datanode確認資訊後,該資料包才會從確認佇列刪除。[注1]

6. Client完成資料的寫入後,回對資料流呼叫close()方法

7. 將剩餘所有的資料包寫入datanode管線中,並且在練習namenode且傳送檔案寫入完成訊號之前。

[注1]:如果在資料寫入期間,datanode發生故障,則:1.關閉管線,確認把佇列中的任何資料包添加回資料佇列的最前端,一去到故障節點下游的datanode不回漏包。2.為儲存在另一個正常datanode的當前資料塊指定一個新的標誌,並將給標誌傳給namenode,以便故障datanode在恢復後可以刪除儲存的部分資料塊。3.從管線中刪除故障資料節點,並且把餘下的資料塊寫入管線中的兩個正常的datanode。namenode注意到副本量不足時,會在另一個節點上建立一個新的副本。

Hadoop中NameNode單點故障解決方案

Hadoop 1.0核心主要由兩個分支組成:MapReduce和HDFS,這兩個系統的設計缺陷是單點故障,即MR的JobTracker和HDFS的NameNode兩個核心服務均存在單點問題,這裡只討論HDFS的NameNode單點故障的解決方案。

[問題]

HDFS仿照google GFS實現的分散式儲存系統,由NameNode和DataNode兩種服務組成,其中NameNode是儲存了元資料資訊(fsimage)和操作日誌(edits),由於它是唯一的,其可用性直接決定了整個儲存系統的可用性。因為客戶端對HDFS的讀、寫操作之前都要訪問name node伺服器,客戶端只有從name node獲取元資料之後才能繼續進行讀、寫。一旦NameNode出現故障,將影響整個儲存系統的使用。

[解決方案]

Hadoop官方提供了一種quorum journal manager來實現高可用,在高可用配置下,edit log不再存放在名稱節點,而是存放在一個共享儲存的地方,這個共享儲存由若干Journal Node組成,一般是3個節點(JN小叢集), 每個JN專門用於存放來自NN的編輯日誌,編輯日誌由活躍狀態的名稱節點寫入。

要有2個NN節點,二者之中只能有一個處於活躍狀態(active),另一個是待命狀態(standby),只有active節點才能對外提供讀寫HDFS服務,也只有active態的NN才能向JN寫入編輯日誌;standby的名稱節點只負責從JN小叢集中的JN節點拷貝資料到本地存放。另外,各個DATA NODE也要同時向兩個NameNode節點報告狀態(心跳資訊、塊資訊)。

 一主一從的2個NameNode節點同時和3個JN構成的組保持通訊,活躍的NameNode節點負責往JN叢集寫入編輯日誌,待命的NN節點負責觀察JN組中的編輯日誌,並且把日誌拉取到待命節點(接管Secondary NameNode的工作)。再加上兩節點各自的fsimage映象檔案,這樣一來就能確保兩個NN的元資料保持同步。一旦active不可用,standby繼續對外提供服。架構分為手動模式和自動模式,其中手動模式是指由管理員通過命令進行主備切換,這通常在服務升級時有用,自動模式可降低運維成本,但存在潛在危險。