從零開始學Hadoop----淺析HDFS(二)

      上一篇,我們簡單介紹了一下Hadoop的核心之一HDFS,對其中的一些概念有了一定的瞭解。今天我們來看看HDFS的一些原理解析。

二、原理解析

1、架構

這裏寫圖片描述

      HDFS是一個主/從(Mater/Slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統一樣,可以通過目錄路徑對文件執行CRUD(Create、Read、Update和Delete)操作。但由於分佈式存儲的性質,HDFS集羣擁有一個NameNode和一些DataNode。

      NameNode管理文件系統的元數據,DataNode存儲實際的數據。客戶端通過同NameNode和DataNodes的交互訪問文件系統。客戶端聯繫NameNode以獲取文件的元數據,而真正的文件I/O操作是直接和DataNode進行交互的。

2、管理員更新日誌

這裏寫圖片描述
- CheckPoint的時間點

fs.checkpoint.period 指定兩次checkpoint的最大時間間隔,默認3600秒。 
fs.checkpoint.size    規定edits文件的最大值,一旦超過這個值則強制checkpoint,不管是否到達最大時間間隔。默認大小是64M。
  • 流程解析
1、每隔兩個小時,或者edits文件超過最大值時,SecondaryNameNode通知NameNode切換edits,
此時在NameNode中生成一個名爲edits.new的新edits,在fsimage被替換之前,所有的操作都會寫到edits.new中。
2、SecondaryNameNode通過Http協議複製edits和fsimage到SecondaryNameNode中
3、SecondaryNameNode將fsimage導入內存,用edits中的操作,生成新的fsimage.ckpt文件
4、SecondaryNameNode將新的fsimage複製,並通過http Post傳給NameNode
5、NameNode將接收到的新的fsimage.ckpt替換掉之前的fsimage,同時將新的edits.new重命名爲edits,將之前的替換掉

3、讀文件

這裏寫圖片描述

初始化FileSystem,然後客戶端(client)用FileSystem的open()函數打開文件
FileSystem用RPC調用元數據節點,得到文件的數據塊信息,對於每一個數據塊,元數據節點返回保存數據塊的數據節點的地址。
FileSystem返回FSDataInputStream給客戶端,用來讀取數據,客戶端調用stream的read()函數開始讀取數據。
DFSInputStream連接保存此文件第一個數據塊的最近的數據節點,data從數據節點讀到客戶端(client)
當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的連接,然後連接此文件下一個數據塊的最近的數據節點。
當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。
在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。
失敗的數據節點將被記錄,以後不再連接。

4、寫文件

這裏寫圖片描述

初始化FileSystem,客戶端調用create()來創建文件
FileSystem用RPC調用元數據節點,在文件系統的命名空間中創建一個新的文件,元數據節點首先確定文件原來不存在,
並且客戶端有創建文件的權限,然後創建新文件。
FileSystem返回DFSOutputStream,客戶端用於寫數據,客戶端開始寫入數據。
DFSOutputStream將數據分成塊,寫入data queuedata queueData Streamer讀取,
並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認複製3塊)。
分配的數據節點放在一個pipeline裏。Data Streamer將數據塊寫入pipeline中的第一個數據節點。
第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。
DFSOutputStream爲發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。
當客戶端結束寫入數據,則調用stream的close函數。
此操作將所有的數據塊寫入pipeline中的數據節點,並等待ack queue返回成功。
最後通知元數據節點寫入完畢。
如果數據節點在寫入的過程中失敗,關閉pipeline,將ack queue中的數據塊放入data queue的開始,
當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啓後能夠察覺其數據塊是過時的,會被刪除。
失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點。
元數據節點則被通知此數據塊是複製塊數不足,將來會再創建第三份備份。

總結:

      今天我們接着上次介紹了一下HDFS的概念之後,我們對HDFS的架構,內部構造以及運行原理做了一些解析,下次我們將在實戰中熟練使用HDFS做一些例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章