對于一個企業大資料應用來說,搞定了大資料存儲基本上就解決了大資料應用最重要的問題。Google 三駕馬車的第一駕是GFS,Hadoop最先開始設計的就是HDFS,可見分布式存儲的重要性,整個大資料生态計算架構多種多樣,但是大資料的存儲卻沒有太大的變化,HDFS依舊是衆多分布式計算的基礎。當然HDFS也有許多缺點,一些對象存儲等技術的出現給HDFS的地位帶來了挑戰,但是HDFS目前還是最重要的大資料存儲技術,新的計算架構想要獲得廣泛應用依舊需要支援HDFS。大資料資料量大、類型多種多樣、快速的增長等特性,那麼HDFS是如何去解決大資料存儲、高可用通路的了?
HDFS系統架構
Hadoop分布式檔案系統的設計目标就是把數以千計的伺服器管理起來,将這麼大規模的伺服器當作一個分布式檔案系統進行管理,以提供PB存儲容量應對大量資料的存儲,同時供計算架構和上層應用提供服務,可以像普通檔案系統一樣存儲、通路大規模的檔案資料。具體的實作是将資料進行分塊後進行并行的存儲以及備援存儲,如下系統架構:

圖中hdfs中有兩個關鍵元件,一個是Namenode負責對分布式檔案系統中繼資料的管理,存儲了檔案名、路徑、副本數量、資料塊id以及存儲的Datanode節點等資訊,另一個是Datanode節點,負責檔案資料的存儲和讀寫操作,HDFS将檔案資料分割成若幹資料塊,每個DataNode存儲一部分資料塊,這樣檔案就分布存儲在整個HDFS伺服器中。
大量資料存儲的解決?
從hdfs系統架構就可以看出,通過将大檔案切分成小的資料塊存儲到不同伺服器上,可以實作一個大檔案的存儲,同時通過聯合多個伺服器多塊硬碟實作整個存儲系統的大容量,大檔案的分片存儲,不同分片可以進行并行讀寫操作,進而實作資料的高速通路。
HDFS檔案系統高可用設計?
在一個分布式系統中,節點失效是比較常見的,在HDFS系統中不可避免的遇到網絡問題、磁盤故障、DataNode節點故障、Namenode節點故障,那麼HDFS是如何應對這些問題,保障系統的高可用的了。
首先我們來看下資料存儲的故障容錯,這塊主要是磁盤媒體,存儲資料可能會出現錯亂,這個HDFS主要會對存儲在DataNode上的資料塊,計算并存儲校驗和,并計算Datanode讀取資料的校驗和,如果異常就會轉而去讀取其他DataNode節點的備份資料。
其次,節點故障,磁盤,HDFS節點故障主要是通過心跳機制,DataNode會定期通過心跳去NameNode保持聯系,Namenode監測到DataNode逾時沒有心跳後,就會查其中繼資料,通知其他節點複制失效節點上的資料塊到其他伺服器上,保證副本數量,磁盤故障的話DataNode也是類似處理,DataNode檢測到磁盤故障後,将故障快回報給namenode進行資料塊複制。
接着NameNode鼓掌容錯,作為HDFS核心節點,記錄着HDFS檔案配置設定表資訊,所有的檔案路徑和資料塊存儲資訊都儲存在NameNode上,NameNode故障将導緻整個叢集的不可用,HDFS設計采用主從熱備提高系統的可用性。
HDFS檔案系統高吞吐量設計?
在檔案操作中,NameNode負責檔案中繼資料的操作,DataNode負責處理檔案的讀寫請求,檔案資料流不會經過NameNode的處理,隻會跟存儲在具體DataNode進行聯系,是以NameNode不會成為系統的瓶頸,成百上千台DataNode節點應對檔案内容資料流的讀寫,其吞吐量大大提高了。
HDFS的缺點
資料通路延時較長,資料以分塊的方式存儲在磁盤當中,讀取需要經過Namenode到DataNode網絡通路流程,以及磁盤尋址的過程,不如記憶體緩存通路高效以及不如關系型資料庫利用索引加快資料通路特性。
不适合大量小檔案存儲,小檔案太多造成檔案中繼資料過多,超出了NameNode的處理能力,容易造成NameNode的瓶頸。
檔案寫入支援單一,隻支援追加檔案,不支援随機檔案寫入以及檔案更新。