Hadoop學習2-HDFS詳解1

HDFS前言

HDFS產生背景:node

數據量愈來愈大,在一個操做系統下存不下全部數據,那麼就須要分配到更多的操做系統管理的磁盤中,可是這樣不方便管理。因此須要一種系統來管理多臺機器上的文件,這句詩分佈式文件管理系統,HDFS只是分佈式文件管理系統中的一種。

HDFS是什麼:安全

Hadoop Distributed File System ,Hadoop分佈式文件系統,由不少服務器聯合起來實現其功能,集羣中的服務器有各自的角色。主要用來解決海量數據的存儲問題。

HDFS使用場景:服務器

適合一次寫入,屢次讀出的場景,且不支持文件的修改。因此適合用來作數據分析,不適合用來作網盤應用。

設計思想:網絡

一、分散均勻存儲 dfs.blocksize = 128M

二、備份冗餘存儲 dfs.replication = 3(數據默認存3份)

在大數據系統中的應用:框架

爲各種分佈式運算框架(如:mapreduce,spark,tez,……)提供數據存儲服務。

重點概念:分佈式

文件切塊,副本存放,元數據

HDFS 的概念和特性

概念: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. 爲何塊的大小不能設置的過小,也不能設置的太大。
(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
相關文章
相關標籤/搜索