HDFS產生背景:node
數據量愈來愈大,在一個操做系統下存不下全部數據,那麼就須要分配到更多的操做系統管理的磁盤中,可是這樣不方便管理。因此須要一種系統來管理多臺機器上的文件,這句詩分佈式文件管理系統,HDFS只是分佈式文件管理系統中的一種。
HDFS是什麼:安全
Hadoop Distributed File System ,Hadoop分佈式文件系統,由不少服務器聯合起來實現其功能,集羣中的服務器有各自的角色。主要用來解決海量數據的存儲問題。
HDFS使用場景:服務器
適合一次寫入,屢次讀出的場景,且不支持文件的修改。因此適合用來作數據分析,不適合用來作網盤應用。
設計思想:網絡
一、分散均勻存儲 dfs.blocksize = 128M 二、備份冗餘存儲 dfs.replication = 3(數據默認存3份)
在大數據系統中的應用:框架
爲各種分佈式運算框架(如:mapreduce,spark,tez,……)提供數據存儲服務。
重點概念:分佈式
文件切塊,副本存放,元數據
概念:oop
首先,它是一個文件系統,用於存儲文件,經過統一的命名空間——目錄樹來定位文件 其次,它是分佈式的,由不少服務器聯合起來實現其功能,集羣中的服務器有各自的角色;
重要特性:大數據
(1)HDFS中的文件在物理上是分塊存儲(block),塊的大小能夠經過配置參數( dfs.blocksize)來規定,默認大小在hadoop2.x版本中是128M,老版本中是64M (2)HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端經過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data (3)目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔 ——namenode是HDFS集羣主節點,負責維護整個hdfs文件系統的目錄樹,以及每個路徑(文件)所對應的block塊信息(block的id,及所在的datanode服務器) (4)文件的各個block的存儲管理由datanode節點承擔 \---- datanode是HDFS集羣從節點,每個block均可以在多個datanode上存儲多個副本(副本數量也能夠經過參數設置dfs.replication) (5)HDFS是設計成適應一次寫入,屢次讀出的場景,且不支持文件的修改 _(注:適合用來作數據分析,並不適合用來作網盤應用,由於,不便修改,延遲大,網絡開銷大,成本過高)_
圖解HDFS:
經過上面的描述咱們知道,hdfs不少特色:spa
保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復(默認存3份)。注意,副本數再大,也大不過節點數。 運行在廉價的機器上 適合大數據的處理。HDFS默認會將文件分割成block,,在hadoop2.x以上版本默認128M爲1個block。而後將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。若是小文件太多,那內存的負擔會很重。
如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。操作系統
NameNode:是Master節點,是大哥(大哥只能有一個)。存儲文件 的元數據,如文件名,文件目錄結構,文件屬性(生成時間,副本數, 文件權限等),以及文件的塊列表(就是指文件被劃分儲存在了 哪些block塊上) 。注意:namenode不存文件,只存 fsimage+edits SecondaryNameNode:是大哥老婆(老婆也就一個)分擔大哥namenode 的工做量(特指合併fsimage和edits),雖然能分擔一部分 大哥的工做量,但永遠不能替代大哥。是NameNode的冷備份,負責定時 默認1小時,從namenode上,獲取fsimage和edits來進行合併, 合併成fsimage.ckpt 並推送給namenode(意味着替換了舊的,所 以namenode和secondrynamenode是交替更新的)。同時還會建立 一個checkpoint還原點。至關於win系統的還原點。減小namenode的工做 量。在緊急狀況下,可輔助恢復namenode(只能回覆部分,並非全部) 因爲secondrynamenode的特色,會發現它仍是蠻雞肋的,既不能立馬 替換掛掉的Namenode並提供服務,又不能徹底恢復Namenode數據。 【爲何不能徹底恢復,其實也很好理解,由於好比規定的是每隔一小時 secondry去拿。咱們在十一點進行了大量操做,而後11:59 namenode掛 了。由於secondry還沒拿到最新的,因此只能恢復到11點的,11-11:59 的就丟失了】 DataNode:Slave節點,小弟,幹活的(小弟就有無數個了)。負責 存儲client發來的數據塊block;執行數據塊的讀寫操做以及塊數據的 校驗和(就是驗證數據的完整性)。正由於要驗證數據的完整性, 因此datanode始終會與namenode保持通信,這個叫作心跳。用來告訴 老大我這個小弟掛沒,以及我存儲了哪些文件的信息報告。 具體點就是經過向 NN 發送心跳保持與其聯繫(3 秒一次), 若是 NN 10 分鐘沒有收到 DN的心跳,則認爲其已經 lost, 並 copy 其上的 block 到其它 DN 熱備份:b是a的熱備份,若是a壞掉。那麼b立刻運行代替a的工做。 冷備份:b是a的冷備份,若是a壞掉。那麼b不能立刻代替a工做。可是 b上存儲a的一些信息,減小a壞掉以後的損失。 fsimage:元數據鏡像文件(文件系統的目錄樹。) edits:元數據的操做日誌(針對文件系統作的修改操做記錄) block塊大小:Block的大小等於傳輸時間\*傳輸速率。在hadoop2.x版本當中 默認大小是128M。而且blcok是datanode當中的子元素。之因此這麼說, 是由於datanode的做用之一就是存儲實際的數據塊。(上面有介紹) 另外,block塊的存儲空間實際上是個虛擬空間。相似於咱們雖然給每臺虛擬 機都設置了50G的存儲空間,可是這50G的空間並無說被硬生生的獨立出 來啊。能用到50G就用到,用不到也不妨礙別人繼續用,差很少就是這麼個 意思。所以不存在說空間浪費的說法。此外,分塊存貯文件,都是一個 block用完就用下一個,不存在平分的說法。舉個例子: 有一個文件130M要存儲到HDFS當中,那麼就至關於該文件佔據了兩個block塊, 在第一個block塊中存放了128M,在第二個blcok塊中存 放了2M,同時就像上面咱們所說,block是虛擬的空間,不是獨立出去的。 因此第二個blcok塊的剩餘空間還能存其餘文件啊。 另外再提一點,咱們已經知道block是存放文件的,那麼要是該文件還有其 他副本呢?很簡單,仍是一樣的block塊也跟着複製。 好比有一個110M的文件,它佔據了1個blcok塊。可是他還有兩個副本,因 此還會再有兩個相同的blcok塊。差很少就是這個意思,文件有副本,對應 的blcok塊也會有相應副本,這是一一對應的。所以,說以並非說文件副 本越多越好。雖然安全了,可是佔據的存儲空間也就多了。 另外,副本存放策略HDFS也會有規則的 副本存放策略: 1) 第一個副本:放置在上傳文件的 DN;若是是集羣外提交,則隨機挑選一臺磁盤不太滿,CPU 不太忙的節點。 2) 第二個副本:放置在於第一個副本不一樣的機架的節點上 3) 第三個副本:與第二個副本相同機架的不一樣節點 4) 更多副本:隨機節點
(1)HDFS的塊是指的過小,會增長尋址時間,程序一直在找塊的開始位置 (2)若是塊設置的太大,從磁盤傳輸數據的時間會明顯大於定位這個塊開始位置所需時間。呆滯程序在處理這塊數據時會很是慢。 總結:HDFS塊的大小設置主要取決於磁盤傳輸速率
2.如何解決上面咱們所說的,就一個namenode老大,掛掉了數據會丟失的問題呢?(其實這就是單點故障問題)
1)啓動一個擁有文件系統元數據的新NameNode(這個通常不採用,由於複製元數據很是耗時間) 2)配置一對活動-備用(Active-Sandby)NameNode,活動NameNode失 效時,備用NameNode當即接管,用戶不會有明顯中斷感受。 共享編輯日誌文件(藉助NFS、zookeeper等) DataNode同時向兩個NameNode彙報數據塊信息 客戶端採用特定機制處理 NameNode失效問題,該機制對用戶透明 方法2就是 HA 高可用方法。
3.通常狀況下HDFS當中這三個進程的啓動順序
namenode > datanode > secondarynamenode