一、HDFS簡介 html
HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分佈式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件的需求而開發的,能夠運行於廉價的商用服務器上。它所具備的高容錯、高可靠性、高可擴展性、高得到性、高吞吐率等特徵爲海量數據提供了不怕故障的存儲,爲超大數據集合的應用帶來了不少便利。java
Hadoop整合了衆多文件系統,在其中有一個綜合性的文件系統抽象,它提供了文件系統實現的各種接口,HDFS只是這個抽象文件系統的一個實例。Hadoop提供了一個高層的文件系統抽象類org.apache.hadoop.fs.FileSystem,這個抽象類展現了一個分佈式文件系統,並有幾個具體的實現,如表1-1所示。node
表1-1 Hadoop文件系統數據庫
Hadoop提供了許多文件系統的接口,用戶可使用URI方案選取合適的文件系統實現交互。apache
二、HDFS基礎概念 緩存
2.1 數據庫(block)安全
2.2 NameNode和DataNode服務器
HDFS體系結構中有兩類節點,一類是NameNode,又叫「元數據節點」;另外一類是DataNode,又叫「數據節點」。這兩類節點分別是承擔Master和Worker具體任務的執行節點。網絡
1)元數據節點用來管理文件系統的命名空間數據結構
2)數據節點是文件系統中真正存儲數據的地方
3)從元數據節點(secondary namenode)
2.3 元數據節點目錄結構
VERSION文件是java properties文件,保存了HDFS的版本號。
2.4 數據節點的目錄結構
2.5 文件系統命名空間映像文件及修改日誌
三、HDFS體系結構
HDFS是一個主/從(Master/Slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統同樣,能夠經過目錄路徑對文件執行CRUD(Create、Read、Update、Delete)操做。但因爲分佈式存儲的性質,HDFS集羣擁有一個NameNode和一些DataNode。NameNode管理文件系統的元數據,DataNode存儲實際的數據。客戶端經過同NameNode和DataNodes的交互訪問文件系統。客戶端聯繫NameNode以獲取文件的元數據,而真正的文件I/O操做是直接和DataNode進行交互的。
圖3-1 Hadoop的體系結構
1)NameNode、DataNode和Client
2)文件寫入
3)文件讀取
HDFS典型的部署是在一個專門的機器上運行的NameNode,集羣中的其餘機器各運行一個DataNode;也能夠在運行NameNode的機器上同時運行DataNode,或者一臺機器上運行多個DataNode。一個集羣只有一個NameNode的設計大大簡化了系統架構。
四、HDFS的優缺點
4.1 HDFS的優勢
1)處理超大文件
這裏的超大文件一般是指百MB、甚至數百TB大小的文件。目前在實際應用中,HDFS已經能用來存儲管理PB級的數據了。
2)流式的訪問數據
HDFS的設計創建在更多地響應「一次寫入、屢次讀寫」任務的基礎上。這意味着一個數據集一旦由數據源生成,就會被複製分發到不一樣的存儲節點中,而後響應各類各樣的數據分析任務請求。在多數狀況下,分析任務都會涉及數據集中的大部分數據,也就是說,對HDFS來講,請求讀取整個數據集要比讀取一條記錄更加高效。
3)運行於廉價的商用機器集羣上
Hadoop設計對硬件需求比較低,只需要運行在低廉的商用硬件集羣上,而無需昂貴的高可用性機器上。廉價的商用機器也就意味着大型集羣中出現節點故障狀況的機率很是高。這就要求設計HDFS時要充分考慮數據的可靠性、安全性及高可用性。
4.2 Hadoop的缺點
1)不適合低延遲數據訪問
若是要處理一些用戶要求時間比較短的低延遲應用請求,則HDFS不適合。HDFS是爲處理大型數據集分析任務的,主要是爲達到高的數據吞吐量而設計的,這就可能要求以高延遲做爲代價。
改進策略:對於那些有低延遲要求的應用程序,HBase是一個更好的選擇。經過上層數據管理項目來儘量地補充這個不足。在性能上有了很大的提高,它的口號就是goes real time。使用緩存或多master設計能夠下降client的數據請求壓力,以減小延遲。還有就是對HDFS系統內部的修改,這就得權衡大吞吐量與低延遲了,HDFS不是萬能的。
2)沒法高效存儲大量小文件
由於NameNode把文件系統的元數據放置在內存中,因此文件系統所能容納的文件數目是由NameNode的內存大小來決定。通常來講,每個文件、文件夾和Block須要佔據150字節左右的空間,因此,若是你有100萬個文件,每個佔據一個Block,你就至少須要300M內存。當前來講,數百萬的文件仍是可行的,當擴展到數十億時,對於當前的硬件水平來講就沒辦法實現了。還有一個問題就是,由於Map task的數據是由splits來決定的,因此用MR處理大量的小文件時,就會產生過多的Maptask,線程管理開銷將會增長做業時間。舉個例子,處理10000M的文件,若每一個split爲1M,那就會有10000個Maptasks,會有很大的線程開銷;若每一個split爲100M,則只有100個Maptasks,每一個Maptask將會有更多的事情作,而線程的管理開銷也將減小不少。
改進策略:要想讓HDFS能處理好小文件,有很多方法。
3)不支持多用戶寫入及任意修改文件
在HDFS的一個文件中只有一個寫入者,並且寫操做只能在文件末尾完成,即只能執行追加操做。目前HDFS還不支持多個用戶對同一個文件的寫操做,以及在文件任意位置進行修改。
五、HDFS經常使用操做
先說一下「hadoop fs」和「hadoop dfs」的區別,看兩本Hadoop書上各有用到,但效果同樣,求證與網絡發現下面一解釋比較中肯。
粗略的講,fs是個比較抽象的層面,在分佈式環境中,fs就是dfs,但在本地環境中,fs是local file system,這個時候dfs就不能用。
5.1 文件操做
1)列出HDFS文件
2)列出HDFS目錄下某個文檔中的文件
3)上傳文件到HDFS
4)將HDFS中文件複製到本地系統中
5)刪除HDFS下的文檔
6)查看HDFS下某個文件
「hadoop fs」的命令遠遠不止這些,本小節的命令能夠再HDFS上完成大多數常規操做。對於其餘操做,能夠經過「-help commandName」命令所列出的清單來進一步學習與探索。
5.2 管理與更新
1)報告HDFS的基本統計狀況
此處爲你展現經過「-report」命令如何查看HDFS的基本統計信息:
執行結果以下所示。
2)退出安全模式
NameNode在啓動時會自動進入安全模式。安全模式是NameNode的一種狀態,在這個階段,文件系統不容許有任何修改。安全模式的目的是在系統啓動時檢查各個DataNode上數據塊的有效性,同時根據策略對數據塊進行必要的複製或刪除,當數據塊最小百分比數知足的最小副本數條件時,會自動退出安全模式。
系統顯示「Name node is in safe mode」,說明系統正處於安全模式,這時只須要等待17秒便可,也能夠經過下面的命令退出安全模式。
成功退出安全模式的結果以下所示。
3)進入安全模式
在必要的狀況下,能夠經過如下命令把HDFS置於安全模式。
執行結果以下所示。
4)添加節點
可擴展性是HDFS的一個重要特性,向HDFS集羣中添加節點是很容易實現的。添加一個新的DataNode節點,首先在新加節點上安裝好Hadoop,要和NameNode使用相同的配置(能夠直接從NameNode複製),修改"/usr/hadoop/conf/master"文件,加入NameNode主機名。而後在NameNode節點上修改"/usr/hadoop/conf/slaves"文件,加入新節點主機名,再創建到新加點無密碼的SSH鏈接,運行啓動命令:
5)負載均衡
HDFS的數據在各個DataNode中的分佈確定很不均勻,尤爲是DataNode節點出現故障或者新增DataNode節點時。新增數據塊NameNode對DataNode節點的選擇策略也有可能致使數據塊分佈的不均勻。用戶可使用命令從新平衡DataNode的數據塊的分佈:
執行命令前,DataNode節點上數據分佈狀況,以下所示。
負載均衡完畢後,DataNode節點上數據的分佈狀況,以下所示。
執行負載均衡命令,以下所示。
感謝原做者,連接:http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html