前言node
前面幾篇簡單介紹了什麼是大數據和Hadoop,也說了怎麼搭建最簡單的僞分佈式和全分佈式的hadoop集羣。接下來這篇我詳細的分享一下HDFS。linux
HDFS前言:shell
設計思想:(分而治之)將大文件、大批量文件,分佈式存放在大量服務器上,以便於採起分而治之的方式對海量數據進行運算分析。安全
在大數據系統中做用:爲各種分佈式運算框架(如:mapreduce,spark,tez,……)提供數據存儲服務。服務器
分佈式文件系統:網絡
問題引起:海量數據超過了單臺物理計算機的存儲能力架構
解決方案:對數據分區存儲與若干臺物理主機中框架
分佈式文件系統應運而生:分佈式
1)管理網絡中跨多臺計算機存儲的文件系統工具
2)HDFS就是這樣的一個分佈式文件系統
1)HDFS集羣分爲兩大角色:NameNode、DataNode
2)NameNode負責管理整個文件系統的元數據
3)DataNode負責管理用戶的文件數據塊
4)文件會按照固定的大小(blocksize)切成若干塊後分布式存儲在若干臺datanode上
5)每個文件塊能夠有多個副本,並存放在不一樣的datanode上
6)DataNode會按期向NameNode彙報自身保存的block信息,而namenode則會負責保持文件的副本數量
7)HDFS的內部工做機制對客戶端保持透明,客戶端請求訪問HDFS都是經過namenode申請來進行
1)HDFS的概念
HDFS採用了主從式(Master/Slave)的體系結構,其中NameNode(NN),DataNode(DN)和Client是HDFS中的3個重要角色。HDFS也在社區的努力下不斷演進,包括支持文件追加,Federation,HA的引入等。
在一個HDFS中,有一個NN,一個SNN(Secondary NameNode)和衆多的DN,在大型的集羣中可能會有數以千計的DN。而Client,通常意義上比數據節點的個數還要多。
NN管理了HDFS兩個最重要的關係:
1)目錄文件樹結構和文件與數據塊的對應關係:會持久化到物理存儲中,文件名叫作fsimage。
2)DN與數據塊的對應關係,即數據塊存儲在哪些DN中:在DN啓動時會上報到NN它所維護的數據塊。這個是動態創建的,不會持久化。所以,集羣的啓動可能須要比較長的時間。
而DN則保存了數據塊。而且執行NN的命令,好比複製,拷貝,刪除等操做。Client則是使用HDFS的主題,包括寫文件,讀文件等常見操做。
總的來講:HDFS是一個文件系統,用於存儲文件,經過統一的命名空間——目錄樹來定位文件。其次,它是分佈式的,由不少服務器聯合起來實現其功能,集羣中的服務器有各自的角色。
2)HDFS的特性
2.1)HDFS中的文件在物理上是分塊存儲(Block),塊的大小能夠經過配置參數(dfs.blocksize)來規定 默認大小在hadoop2.x版本中是128M,老版本中的64M
2.2)HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端經過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
2.3)目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔 namenode是HDFS集羣主節點,負責維護整個HDFS文件系統的目錄樹以及每個路徑(文件)對應的block塊信息(block的id,以及所在的datanode服務器)
2.4)文件的各個block的存儲管理由datanode節點承擔 datanode是HDFS集羣從節點,每個block均可以在多個datanode上存儲多個副本(副本參數也能夠經過參數設置dfs.replication)
2.5)HDFS適應一次寫入,屢次讀出的場景,且不支持文件的修改。
注意:適合用來作數據分析,並不適合用來作網盤應用(由於不方便進行修改,延遲大,網絡開銷大,成本過高)
3)咱們經過一張圖來解釋
經過上面的描述咱們知道,hdfs不少特色:
保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復(默認存3份)。
運行在廉價的機器上
適合大數據的處理。HDFS默認會將文件分割成block,,在hadoop2.x以上版本默認128M爲1個block。而後將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。若是小文件太多,那內存的負擔會很重。
如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。
NameNode:是Master節點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
SecondaryNameNode:是一個小弟,分擔大哥namenode的工做量;是NameNode的冷備份;合併fsimage和fsedits而後再發給namenode。
DataNode:Slave節點,奴隸,幹活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操做。
熱備份:b是a的熱備份,若是a壞掉。那麼b立刻運行代替a的工做。
冷備份:b是a的冷備份,若是a壞掉。那麼b不能立刻代替a工做。可是b上存儲a的一些信息,減小a壞掉以後的損失。
fsimage:元數據鏡像文件(文件系統的目錄樹。)
edits:元數據的操做日誌(針對文件系統作的修改操做記錄)
namenode內存中存儲的是=fsimage+edits。
SecondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合併,而後再發送給namenode。減小namenode的工做量。
1)低延時數據訪問。在用戶交互性的應用中,應用須要在ms或者幾個s的時間內獲得響應。因爲HDFS爲高吞吐率作了設計,也所以犧牲了快速響應。對於低延時的應用,能夠考慮使用HBase或者Cassandra。
2)大量的小文件。標準的HDFS數據塊的大小是64M,存儲小文件並不會浪費實際的存儲空間,可是無疑會增長了在NameNode上的元數據,大量的小文件會影響整個集羣的性能。
前面咱們知道,Btrfs爲小文件作了優化-inline file,對於小文件有很好的空間優化和訪問時間優化。
3)多用戶寫入,修改文件。HDFS的文件只能有一個寫入者,並且寫操做只能在文件結尾以追加的方式進行。它不支持多個寫入者,也不支持在文件寫入後,對文件的任意位置的修改。
可是在大數據領域,分析的是已經存在的數據,這些數據一旦產生就不會修改,所以,HDFS的這些特性和設計侷限也就很容易理解了。HDFS爲大數據領域的數據分析,提供了很是重要並且十分基礎的文件存儲功能。
1)冗餘備份
每一個文件存儲成一系列數據塊(Block)。爲了容錯,文件的全部數據塊都會有副本(副本數量即複製因子,課配置)(dfs.replication)
2)副本存放
採用機架感知(Rak-aware)的策略來改進數據的可靠性、高可用和網絡帶寬的利用率
3)心跳檢測
NameNode週期性地從集羣中的每個DataNode接受心跳包和塊報告,收到心跳包說明該DataNode工做正常
4)安全模式
系統啓動時,NameNode會進入一個安全模式。此時不會出現數據塊的寫操做。
5)數據完整性檢測
HDFS客戶端軟件實現了對HDFS文件內容的校驗和(Checksum)檢查(dfs.bytes-per-checksum)。
HDFS將每一個文件存儲成一系列的數據塊,全部的數據塊都是一樣的大小。(在配置文件中配置每一個數據塊的大小,最後一塊不必定大小同樣)
文件中全部的數據塊都會有副本,每一個文件的數據塊大小和副本系數都是可配置的。
HDFS中的文件都是一次寫入的,而且嚴格要求在任什麼時候候只能有一個寫入者。
咱們能夠查看到經過:hdfs fsck / -file -bloks -locations
HDFS的配置參數:dfs.replication、dfs.blocksize
1)概述
-NN是HDFS主從結構中主節點上運行的主要進程,它負責管理從節點DN。NN維護着整個文件系統的文件目錄樹,文件目錄的元信息和文件的數據塊索引。
這些信息以兩種信息保存在本文文件系統中,一種是文件系統鏡像(文件名字fsimage),另外一種是fsimage的編輯日誌(文件名字edits)。
-fsimage中保存着某一特定時刻HDFS的目錄樹、元信息和文件數據塊的索引等信息,後續的對這些信息的改動,則保存在編輯日誌中,它們一塊兒提供了一個完整的NN的第一關係。
-經過NN,Client還能夠瞭解到數據塊所在的DN的信息。須要注意的是,NN中關於DN的信息是不會保存到NN的本地文件系統的,也就是上面提到的fsimage和edits中。
NN每次啓動時,都會經過每一個DN的上報來動態的創建這些信息。這些信息也就構成了NN第二關係。
-NN還能經過DN獲取HDFS總體運行狀態的一些信息,好比系統的可用空間,已經使用的空間,各個DN的當前狀態等。
2)做用
維護着文件系統數中全部文件和目錄的元數據
協調客戶端對文件的訪問
1)概述
DN是HDFS中硬盤IO最忙碌的部分:將HDFS的數據塊寫到Linux本地文件系統中,或者從這些數據塊中讀取數據。DN做爲從節點,會不斷的向NN發送心跳。
初始化時,每一個DN將當前節點的數據塊上報給NN。NN也會接收來自NN的指令,好比建立、移動或者刪除本地的數據塊,而且將本地的更新上報給NN。
2)做用
接受客戶端或NameNode的調度
存儲和檢索數據塊
在NameNode的統一調度下進行數據塊的建立、刪除和複製
按期向NameNode發送自身存儲的數據塊列表
1)按期合併edits和fsImage(若是沒有配置SecondaryNameNode由NameNode本身完成)
Secondary NameNode是用於按期合併fsimage和edits的。與NN同樣,每一個集羣都有一個SNN,在大規模部署的條件下,通常SNN也獨自佔用一臺服務器。
SNN按照集羣配置的時間建個,不停的獲取HDFS某一個時間點的fsimage和edits,合併它們獲得一個新的fsimage。該fsimage上傳到NN後會替換NN的老的fsimage。
2)防止edits日誌文件過大
從上面能夠看出,SNN會配合NN,爲NN的第一關係提供了一個簡單的CheckPoint機制,並避免出現edits過大,致使NN啓動時間過長的問題。
3)提供那個NameNode的fsImage文件的檢查點,以實現NameNode故障恢復
-HDFS集羣有兩種節點類型,Namenodes和Datanodes,它們工做於master-worker模式。一個namenode是master,一組datanodes是workers。namenode管理整個文件系統的namespace。
它維護一棵文件樹和全部文件/目錄的元信息。這些信息在namenode的本地磁盤上存成兩個文件,一個是該namespace的鏡像,另外一個是編輯日誌(edit log)。
namenode也知道每一個文件的每一個塊都存在哪一個datanode上了,但這個信息不會被持久化下來,由於每次啓動時,這個信息會被從新生成。
-客戶端程序經過訪問namenode和datanodes來訪問HDFS文件系統。可是用戶代碼根本不知道namenode和datanodes的存在,就像訪問POSIX同樣(Portable Operating System Interface:便攜計算機系統接口)。
Datanodes是幹苦力活的。當被客戶端或namenode命令時,它存儲和檢索文件塊(blocks)。它還會按期向namenode彙報它們存儲的文件塊列表。
-沒有namenode,整個文件系統就無法用了。若是把namenode移除,整個文件系統裏的文件就都丟失了,由於沒辦法知道如何從新組裝存在各個datanodes裏的文件塊。
所以有必要保證namenode足夠可靠,Hadoop提供了兩種機制保證namenode裏的數據安全。
-第一個機制是備份namenode上的持久化信息。能夠配置hadoop,讓namenode寫持久化信息時寫到多個地方,而且這些寫操做是串行的而且是原子操做。一般的作法是寫到本地磁盤一份,同時寫到遠程NFS上。
-另外一個機制是配一個secondary namenode。雖然名字上叫namenode,但secondary namenode根本不作namenode的工做,它就是按期把namenode上的namespace鏡像和編輯日誌(edit log)合併到本身身上,以免編輯日誌過大。
secondary namenode一般是一臺單獨的機器,由於合併工做須要大量的CPU和內存資源。由於它的狀態遲於namenode,因此,當namenode發生事故時,確定是會有數據丟失的。
一般的作法是把namenode在NFS上的metadata文件拷貝到secondary namenode,而後啓動這個secondary namenode,讓它成爲namenode。
若是NameNode失效,那麼客戶端或MapReduce做業均沒法讀寫查看文件
1)啓動一個擁有文件系統元數據的新NameNode(這個通常不採用,由於複製元數據很是耗時間)
2)配置一對活動-備用(Active-Sandby)NameNode,活動NameNode失效時,備用NameNode當即接管,用戶不會有明顯中斷感受。
共享編輯日誌文件(藉助NFS、zookeeper等)
DataNode同時向兩個NameNode彙報數據塊信息
客戶端採用特定機制處理 NameNode失效問題,該機制對用戶透明
1)前面在(2. Namenodes和Datanodes)提到的經過備份namenode上的持久化信息,或者經過secondary namenode的方式,只能解決數據不丟失,可是不能提供HA(高可用性),
namenode仍然是「單點失敗」(SPOF:single point of failure)。若是namenode死掉了,全部的客戶端都不能訪問HDFS文件系統裏的文件了,不能讀寫也不能列出文件列表。
2)運行一個文件系統命令在Hadoop集羣支持的文件系統中
檢查須要處理的數據(假定數據已經存放在hdfs的/user/hadoop⽬錄下)
$> hadoop fs -ls /user/hadoop
看到測試數據⽬錄weather_test,完整數據⽬錄weather,專利數據⽬錄patent便可,若沒有則請從服務器下載並上傳⾃⼰的⽬錄下
1)建⽴⽬錄(在hdfs的/user/xxx⽬錄下操做)
$> hdfs dfs -mkdir input
2)查看⽂件或⽬錄
$> hdfs dfs -ls
3)⽂件上傳(將本地⽂件local_file上傳到hdfs的/user/xxx⽬錄下)
$> hdfs dfs -put local_file input
4)下載⽂件或⽬錄到本地當前⽬錄下
$> hdfs dfs -get input .
5)瀏覽hdfs中的⽂件
$> hdfs dfs -cat input/local_file
6)刪除⽂件或者⽬錄
$> hdfs dfs -rm input/local_file
7)在hdfs中複製⽂件或⽬錄
$> hdfs dfs -cp input/local_file input/local_file.bak
8)修改權限
9)查看命令幫助
$> hdfs dfs -help [cmd]
1)系統⽬錄檢查
$> hdfs fsck /user/xxx系統⽬錄詳細檢測
$> hdfs fsck /user/xxx -files -blocks -locations -racks
2)檢測DataNode報告
$> hdfs dfsadmin -report
3)權限管理
$> hdfs fs -chmod 666 /user/xxx
4)hdfs空間⽬錄配額設置
$> hdfs dfsadmin -setSpaceQuota [N] /user/xxx
5)hdfs空間⽬錄配額清除
$> hdfs dfsadmin -clrSpaceQuota /user/xxx
6)查看⽬錄配額設置
$> hdfs fs -count -q /user/xxx
7)刪除DataNode
$> hdfs dfsadmin -refreshNodes
總結:
注意HDFS中的文件系統也是和linux文件系統同樣的。既然是文件系統也有根目錄和家目錄,在HDFS中「/」表明的就是根目錄,而「/user」等於linux中的「/usr」下一級目錄表明的就是用戶了。
可是HDFS沒有這個用戶,因此就有了虛擬用戶,也就是你當前HDFS的Linux系統當前用戶就會默認爲它的虛擬用戶。當咱們有一個zyh用戶時,因此你就能夠建立一個/user/zyh/下面的目錄,就表明着家目錄。
喜歡就點個「推薦」哦!