Hadoop之HDFS及NameNode單點故障解決方案


Hadoop之HDFS

版權聲明:本文為yunshuxueyuan原創文章。
如需轉載請標明出處: http://www.cnblogs.com/sxt-zkys/
QQ技術交流群:299142667

HDFS介紹

HDFS(Hadoop Distributed File System )Hadoop分布式文件系統。是根據google發表的論文翻版的。

什么是分布式文件系統

分布式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點相連。分布式文件系統的設計基於客戶機/服務器模式。

[優點]

支持超大文件 超大文件在這里指的是幾百M,幾百GB,甚至幾TB大小的文件。

檢測和快速應對硬件故障在集群的環境中,硬件故障是常見的問題。因為有上千台服務器連接在一起,這樣會導致高故障率。因此故障檢測和自動恢復是hdfs文件系統的一個設計目標

流式數據訪問應用程序能以流的形式訪問數據集。主要的是數據的吞吐量,而不是訪問速度。

簡化的一致性模型 大部分hdfs操作文件時,需要一次寫入,多次讀取。在hdfs中,一個文件一旦經過創建、寫入、關閉后,一般就不需要修改了。這樣簡單的一致性模型,有利於提高吞吐量。

[缺點]

低延遲數據訪問如和用戶進行交互的應用,需要數據在毫秒或秒的范圍內得到響應。由於hadoop針對高數據吞吐量做了優化,犧牲了獲取數據的延遲,所以對於低延遲來說,不適合用hadoop來做。

大量的小文件Hdfs支持超大的文件,是通過數據分布在數據節點,數據的元數據保存在名字節點上。名字節點的內存大小,決定了hdfs文件系統可保存的文件數量。雖然現在的系統內存都比較大,但大量的小文件還是會影響名字節點的性能。

多用戶寫入文件、修改文件Hdfs的文件只能有一次寫入,不支持寫入,也不支持修改。只有這樣數據的吞吐量才能大。

不支持超強的事務沒有像關系型數據庫那樣,對事務有強有力的支持。

 

[HDFS結構]

 

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。

Client將數據寫入HDFS流程

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繼續對外提供服。架構分為手動模式和自動模式,其中手動模式是指由管理員通過命令進行主備切換,這通常在服務升級時有用,自動模式可降低運維成本,但存在潛在危險。這兩種模式下的架構如下。

[手動模式]

模擬流程:

1. 准備3台服務器分別用於運行JournalNode進程(也可以運行在date node服務器上),准備2台namenode服務器用於運行NameNode進程(兩台配置 要一樣),DataNode節點數量不限。

2. 分別啟動3台JN服務器上的JournalNode進程,分別在date node服務器啟動DataNode進程。

3. 需要同步2台name node之間的元數據。具體做法:從第一台NN拷貝元數據到放到另一台NN,然后啟動第一台的NameNode進程,再到另一台名稱節點上做standby引導。

4. 把第一台名節點的edit日志初始化到JN節點,以供standby節點到JN節點拉取數據。

5. 啟動standby狀態的NameNode節點,這樣就能同步fsimage文件。

6. 模擬故障,手動把active狀態的NN故障,轉移到另一台NameNode。

[自動模式]

模擬流程:

在手動模式下引入了ZKFC(DFSZKFailoverController)和zookeeper集群

ZKFC主要負責: 健康監控、session管理、leader選舉

zookeeper集群主要負責:服務同步

1-6步同手動模式

7. 准備3台主機安裝zookeeper,3台主機形成一個小的zookeeper集群.

8. 啟動ZK集群每個節點上的QuorumPeerMain進程

9. 登錄其中一台NN, 在ZK中初始化HA狀態

10. 模擬故障:停掉活躍的NameNode進程,提前配置的zookeeper會把standby節點自動變為active,繼續提供服務。

腦裂

腦裂是指在主備切換時,由於切換不徹底或其他原因,導致客戶端和Slave誤以為出現兩個active master,最終使得整個集群處於混亂狀態。解決腦裂問題,通常采用隔離(Fencing)機制。

共享存儲fencing:確保只有一個Master往共享存儲中寫數據,使用QJM實現fencing。 

Qurom Journal Manager,基於Paxos(基於消息傳遞的一致性算法),Paxos算法是解決分布式環境中如何就某個值達成一致

[原理]

a. 初始化后,Active把editlog日志寫到JN上,每個editlog有一個編號,每次寫editlog只要其中大多數JN返回成功(過半)即認定寫成功。

b.  Standby定期從JN讀取一批editlog,並應用到內存中的FsImage中。

c. NameNode每次寫Editlog都需要傳遞一個編號Epoch給JN,JN會對比Epoch,如果比自己保存的Epoch大或相同,則可以寫,JN更新自己的Epoch到最新,否則拒絕操作。在切換時,Standby轉換為Active時,會把Epoch+1,這樣就防止即使之前的NameNode向JN寫日志,也會失敗。

客戶端fencing:確保只有一個Master可以響應客戶端的請求。

[原理] 

在RPC層封裝了一層,通過FailoverProxyProvider以重試的方式連接NN。通過若干次連接一個NN失敗后嘗試連接新的NN,對客戶端的影響是重試的時候增加一定的延遲。客戶端可以設置重試此時和時間

Slave fencing:確保只有一個Master可以向Slave下發命令。

[原理]

a. 每個NN改變狀態的時候,向DN發送自己的狀態和一個序列號。

b. DN在運行過程中維護此序列號,當failover時,新的NN在返回DN心跳時會返回自己的active狀態和一個更大的序列號。DN接收到這個返回是認為該NN為新的active。

b. 如果這時原來的active(比如GC)恢復,返回給DN的心跳信息包含active狀態和原來的序列號,這時DN就會拒絕這個NN的命令。

最后在此感謝尚學堂周老師在我學習過程中給予的幫助。

版權聲明:本文為yunshuxueyuan原創文章。
如需轉載請標明出處: http://www.cnblogs.com/sxt-zkys/
QQ技術交流群:299142667


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM