大資料檔案儲存系統HDFS

胖琪的升級之路發表於2019-01-15

現在隨著企業規模的發展,對於資料儲存的要求越來越大,單機儲存效能已經成為儲存的瓶頸,在這裡我們就需要引入分散式儲存,通過水平擴充套件的方式進行容量的擴充套件,並且提高資料的一致性,安全性,可靠性等關係。

大資料也是發展的前景之一,越來越多的開發者開始進入大資料領域,並且很多企業開始關注,逐步發展自己的大資料業務,資料的重要性不言而喻,那麼我們應該怎麼進行資料儲存,擴充套件呢?這正是分散式檔案系統需要解決的問題。

我們今天所要說的重點是大資料儲存的王者HDFS儲存系統。

HDFS

什麼是HDFS呢?官網是這樣解答的,是一種分散式檔案系統,設計用於在商用硬體上商用,管理數以千計的伺服器,數以萬計的磁碟,將大規模的伺服器資源當做一個單一的出承諾函系統進行管理,操作大批量資料就像使用普通檔案系統一樣。

簡單理解其架構

架構圖,摘自極客時間

HDFS是經典的主從架構,當然為了保證高可用,HDFS也提供了高可用的方案,在3.0版本以上更加提供了多個主節點用來幫助提高系統的可用性。

在其設計理念上,有兩個主要的關鍵元件NameNode與DataNode.簡單來說NameNode負責儲存一些後設資料資訊,DataNode負責資料的讀取與寫入,但是真的只是這麼簡單嗎?

我們從Linux的檔案系統就可以看出,檔案系統是有目錄項,索引節點,邏輯塊,超級塊四大元素構成。同樣的HDFS檔案系統也有類似的管理操作。

NameNode

NameNode 究竟負責什麼呢?我們今天就來看一下。

在3.0版本以前,NameNode是隻存在兩個節點的,一個Active節點,一個Standby節點。在3.0以後就可以支援2個以上的NameNode節點了,高可用性得到了提高。

責任

  1. NameNode(Active狀態)
  • 整個分散式檔案系統的後設資料(後設資料)管理。後設資料包括檔案的名字,副本數,儲存的block-id(HDFS中使用block作為儲存單元,block-id包含了哪個DataNode節點)資訊。
  • 接受客戶端的讀寫請求。告知客戶端讀取的資訊去哪裡讀取,寫入資料要寫入到哪個機器
  • 啟動的時候載入後設資料到記憶體中。記憶體中儲存的是 fsimage(後設資料映象檔案,類似於檔案系統的目錄樹)+edits(後設資料的操作日誌,針對檔案系統做的修改操作記錄)。我們如果系統出現錯誤的格式化,當另外節點資料好儲存著可以進行資料的恢復。
  • 通過心跳的方式與DataNode進行存活的通訊。
  • 資料備份告知。
  1. SecondryNameNode的工作
  • 預設1小時定期合併Active NameNode 下的fsimage與edits,避免edit log過大。是通過建立檢查點checkpoint來實現的。
  • 合併完畢後,在傳送給Active NameNode ,可以說不算是Active 的備份節點。
  1. HDFS的Federation 這個是用來擴充套件單機NameNode 水平擴充套件的問題的,管理多個名稱空間,降低單機操作的讀寫的壓力。

DataNode

DadaNode 主要是資料的讀取,寫入,儲存,冗餘等內容。

  • 硬碟故障容錯,檢測到本地硬碟出現故障,會將其所儲存的BlockID內容報告給NameNode,NameNode進行排程按照其他伺服器進行備份處理。
  • 儲存資料塊Block
  • 啟動執行緒與NameNode進行通訊,彙報其儲存的BlockID資訊
  • 保持3秒的心跳連結,超過一定時間認為資料節點丟失。
  • Block的放置策略如下(機架的問題下次再說):
    1. 第一個副本,放置在本機上,如果是叢集外提交的,隨機選擇不太忙的節點儲存。有就近的原則
    2. 第二個副本,放置在與第一個副本不同機架上的節點上。
    3. 第三個副本,放置在與第二副本相同機架上的相鄰節點上。
    4. 更多副本隨機放置。

資料的讀取與寫入

讀取檔案流程

讀檔案

  1. 我們程式是作為客戶端的存在,根據api進行操作
  2. 然後訪問Namenode,傳輸給需要讀取的檔案
  3. Namenode 檢視需要的後設資料資訊,包含路徑所存在block-id資訊,還有datanode資訊。
  4. 根據返回的block-id進行(就近原則)讀取,具有先後順序。
  5. 每讀取取完一個block後,會接著讀取下一個block塊
  6. 注意 4和5的流程是並行處理的。客戶端剛開始就並行的讀取多個block塊的資料,單位是packet為單位接收,本地快取。
  7. 下載完畢後,在進行組裝,根據block追加成為檔案,完整的資料就完成下載了。

寫檔案流程

寫檔案

  1. 客戶端 建立好需要的api操作。
  2. 開啟與nameNode的連結,檢查目標檔案是否存在,目錄內容是否存在等資訊.
  3. namenode返回可以上傳的資訊包含要上傳的位置datanode 節點資訊等。
  4. 客戶端請求就近的節點開始上傳資料,按照packet為單位,後面備份的節點資料是通過非同步呼叫的通道放大建立管道傳輸資料。本質上上傳了一個節點,其他節點是通過複製傳輸完成的。
  5. 當第一個block寫完之後,客戶端再次請求namenode上傳第二個block的伺服器。重複以上步驟。
  6. 寫入也是併發的寫入。

相關文章