1. 程式人生 > >HDFS分散式儲存架構和讀寫機制總結

HDFS分散式儲存架構和讀寫機制總結

 如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。

  NameNode:是Master節點,是大領導。管理資料塊對映;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;

  SecondaryNameNode:是一個小弟,分擔大哥namenode的一部分工作量;是NameNode的冷備份;合併fsimage和fsedits然後再發給namenode。

  DataNode:Slave節點,幹活的。負責儲存client發來的資料塊block;執行資料塊的讀寫操作。

  熱備份

:b是a的熱備份,如果a壞掉。那麼b馬上執行代替a的工作。

  冷備份:b是a的冷備份,如果a壞掉。那麼b不能馬上代替a工作。但是b上儲存a的一些資訊,減少a壞掉之後的損失。

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

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

  namenode記憶體中儲存的是=fsimage+edits。

SecondaryNameNode負責定時預設1小時,從namenode上,獲取fsimage和edits來進行合併,然後再發送給namenode。減少namenode的工作量

1.工作機制

NameNode 負責管理整個檔案系統元資料;DataNode 負責管理具體檔案資料塊儲存;Secondary NameNode 協助 NameNode 進行元資料的備份。 HDFS 的內部工作機制對客戶端保持透明,客戶端請求訪問 HDFS 都是通過向NameNode 申請來進行。

2.讀寫流程

* HDFS 寫資料流程

 1、 client 發起檔案上傳請求,通過 RPC 與 NameNode 建立通訊,NameNode檢查目標檔案是否已存在,父目錄是否存在,返回是否可以上傳;

2、 client 請求第一個 block 該傳輸到哪些 DataNode 伺服器上;

3、 NameNode 根據配置檔案中指定的備份數量及機架感知原理進行檔案分配,返回可用的 DataNode 的地址如:A,B,C;

注: Hadoop 在設計時考慮到資料的安全與高效,資料檔案預設在 HDFS 上存放三份, 儲存策略 為本地一份,同機架內其它某一節點上一份,不同機架的某一節點上一份。

4、 client 請求 3 臺 DataNode 中的一臺 A 上傳資料(本質上是一個 RPC 呼叫,建立 pipeline), A 收到請求會繼續呼叫 B,然後 B 呼叫 C,將整個pipeline 建立完成,後逐級返回 client。

5、 client 開始往 A 上傳第一個 block(先從磁碟讀取資料放到一個本地記憶體快取),以 packet 為單位(預設 64K),A 收到一個 packet 就會傳給 B,B 傳給 C;A 每傳一個 packet 會放入一個應答佇列等待應答。

6、 資料被分割成一個個 packet 資料包在 pipeline 上依次傳輸,在pipeline 反方向上,逐個傳送 ack(命令正確應答),最終由 pipeline中第一個 DataNode 節點 A 將 pipeline ack 傳送給 client。

7、 當一個 block 傳輸完成之後,client 再次請求 NameNode 上傳第二個block 到伺服器。

*HDFS 讀資料流程

1、 Client 向 NameNode 發起 RPC 請求,來確定請求檔案 block 所在的位置。

2、 NameNode會視情況返回檔案的部分或者全部block列表,對於每個block,NameNode 都會返回含有該 block 副本的 DataNode 地址。

3、 這些返回的 DN 地址,會按照叢集拓撲結構得出 DataNode 與客戶端的距離,然後進行排序,排序兩個規則:網路拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態為 STALE,這樣的排靠後。

4、 Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是DataNode,那麼將從本地直接獲取資料。

5、 底層上本質是建立 Socket Stream(FSDataInputStream),重複的呼叫父類 DataInputStream 的 read 方法,直到這個塊上的資料讀取完畢。

6、 當讀完列表的 block 後,若檔案讀取還沒有結束,客戶端會繼續向NameNode 獲取下一批的 block 列表。

7、 讀取完一個 block 都會進行 checksum 驗證,如果讀取 DataNode 時出現錯誤,客戶端會通知 NameNode,然後再從下一個擁有該 block 副本的DataNode 繼續讀。

8、 read 方法是並行的讀取 block 資訊,不是一塊一塊的讀取;NameNode 只是返回Client請求包含塊的DataNode地址,並不是返回請求塊的資料。