如今隨着企業規模的發展,對於數據存儲的要求愈來愈大,單機存儲性能已經成爲存儲的瓶頸,在這裏咱們就須要引入分佈式存儲,經過水平擴展的方式進行容量的擴展,而且提升數據的一致性,安全性,可靠性等關係。node
大數據也是發展的前景之一,愈來愈多的開發者開始進入大數據領域,而且不少企業開始關注,逐步發展本身的大數據業務,數據的重要性不言而喻,那麼咱們應該怎麼進行數據保存,擴展呢?這正是分佈式文件系統須要解決的問題。api
咱們今天所要說的重點是大數據存儲的王者HDFS存儲系統。緩存
HDFS
什麼是HDFS呢?官網是這樣解答的,是一種分佈式文件系統,設計用於在商用硬件上商用,管理數以千計的服務器,數以萬計的磁盤,將大規模的服務器資源當作一個單一的出承諾函系統進行管理,操做大批量數據就像使用普通文件系統同樣。安全
簡單理解其架構
HDFS是經典的主從架構,固然爲了保證高可用,HDFS也提供了高可用的方案,在3.0版本以上更加提供了多個主節點用來幫助提升系統的可用性。服務器
在其設計理念上,有兩個主要的關鍵組件NameNode與DataNode.簡單來講NameNode負責保存一些元數據信息,DataNode負責數據的讀取與寫入,可是真的只是這麼簡單嗎?架構
咱們從Linux的文件系統就能夠看出,文件系統是有目錄項,索引節點,邏輯塊,超級塊四大元素構成。一樣的HDFS文件系統也有相似的管理操做。併發
NameNode
NameNode 究竟負責什麼呢?咱們今天就來看一下。異步
在3.0版本之前,NameNode是隻存在兩個節點的,一個Active節點,一個Standby節點。在3.0之後就能夠支持2個以上的NameNode節點了,高可用性獲得了提升。分佈式
責任
- NameNode(Active狀態)
- 整個分佈式文件系統的元數據(元數據)管理。元數據包括文件的名字,副本數,存儲的block-id(HDFS中使用block做爲存儲單元,block-id包含了哪一個DataNode節點)信息。
- 接受客戶端的讀寫請求。告知客戶端讀取的信息去哪裏讀取,寫入數據要寫入到哪一個機器
- 啓動的時候加載元數據到內存中。內存中存儲的是 fsimage(元數據鏡像文件,相似於文件系統的目錄樹)+edits(元數據的操做日誌,針對文件系統作的修改操做記錄)。咱們若是系統出現錯誤的格式化,當另外節點數據好保存着能夠進行數據的恢復。
- 經過心跳的方式與DataNode進行存活的通訊。
- 數據備份告知。
- SecondryNameNode的工做
- 默認1小時按期合併Active NameNode 下的fsimage與edits,避免edit log過大。是經過建立檢查點checkpoint來實現的。
- 合併完畢後,在發送給Active NameNode ,能夠說不算是Active 的備份節點。
- HDFS的Federation 這個是用來擴展單機NameNode 水平擴展的問題的,管理多個命名空間,下降單機操做的讀寫的壓力。
DataNode
DadaNode 主要是數據的讀取,寫入,存儲,冗餘等內容。性能
- 硬盤故障容錯,檢測到本地硬盤出現故障,會將其所存儲的BlockID內容報告給NameNode,NameNode進行調度按照其餘服務器進行備份處理。
- 存儲數據塊Block
- 啓動線程與NameNode進行通訊,彙報其存儲的BlockID信息
- 保持3秒的心跳連接,超過必定時間認爲數據節點丟失。
- Block的放置策略以下(機架的問題下次再說):
- 第一個副本,放置在本機上,若是是集羣外提交的,隨機選擇不太忙的節點存儲。有就近的原則
- 第二個副本,放置在與第一個副本不一樣機架上的節點上。
- 第三個副本,放置在與第二副本相同機架上的相鄰節點上。
- 更多副本隨機放置。
數據的讀取與寫入
讀取文件流程
- 咱們程序是做爲客戶端的存在,根據api進行操做
- 而後訪問Namenode,傳輸給須要讀取的文件
- Namenode 查看須要的元數據信息,包含路徑所存在block-id信息,還有datanode信息。
- 根據返回的block-id進行(就近原則)讀取,具備前後順序。
- 每讀取取完一個block後,會接着讀取下一個block塊
- 注意 4和5的流程是並行處理的。客戶端剛開始就並行的讀取多個block塊的數據,單位是packet爲單位接收,本地緩存。
- 下載完畢後,在進行組裝,根據block追加成爲文件,完整的數據就完成下載了。
寫文件流程
- 客戶端 建立好須要的api操做。
- 打開與nameNode的連接,檢查目標文件是否存在,目錄內容是否存在等信息.
- namenode返回能夠上傳的信息包含要上傳的位置datanode 節點信息等。
- 客戶端請求就近的節點開始上傳數據,按照packet爲單位,後面備份的節點數據是經過異步調用的通道放大創建管道傳輸數據。本質上上傳了一個節點,其餘節點是經過複製傳輸完成的。
- 當第一個block寫完以後,客戶端再次請求namenode上傳第二個block的服務器。重複以上步驟。
- 寫入也是併發的寫入。