Hadoop生態系統之HDFS

一、介紹


HDFS : 分佈式文件系統(distributed filesystem),主從結構。

             以流式數據訪問模式來存儲超大文件,運行於商用硬件集羣上。

超大文件: 幾百M,幾百G,甚至幾百TB大小的文件。

流式數據訪問: 一次寫入,多次讀取。每次讀取都涉及到數據集的大部分數據甚至是全部,因

                    此讀取整個數據集的延遲比讀取一條數據的延遲更爲重要)

商用硬件:不需要運行在高昂的高可靠的硬件上。

官方介紹: http://hadoop.apache.org/docs/r2.6.4/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

 

二、NameNode 和 DataNodes

HDFS是一個主從master/slave架構。一個HDFS集羣包含一個NameNode,這是一個master服務器,用來管理文件系統的命名空間以及調節客戶端對文件的訪問。除此,會有一堆DataNode,通常是集羣裏每個節點一個DataNode,管理在此節點上的數據存儲。HDFS對外暴露一個文件系統命名空間,並允許用戶數據以文件的形式存儲。在內部,一個文件被分成一個或多個塊並且這些塊被存儲在一組DataNode上。NameNode來執行文件系統命名空間的操作比如打開、關閉、重命名文件和目錄。NameNode同時也負責決策將數據塊映射到對應的DataNode。而DataNode負責服務文件系統客戶端發出的讀寫請求。DataNode同時也負責接受NameNode的指令來進行數據塊的創建、刪除和複製。

 

NameNode和DataNode都是被設計爲在普通PC機上運行的軟件程序。這些機器最典型的就是運行在一個GNU/Linux操作系統上。HDFS是Java寫的;任何支持Java的機器都可以運行NameNode或者DataNode。Java語言本身的可移植性意味着HDFS可以被廣泛的部署在不同的機器上。一個典型的部署就是一臺專用機器來運行NameNode。集羣中的其他機器每臺運行一個DataNode實例。該架構並不排除在同一臺機器上運行多個DataNode實例,但在實際的部署中很少的情況下會這麼做。

單一NameNode的設計極大的簡化了集羣的系統架構。NameNode是所有HDFS元數據的仲裁和存儲庫。系統被設計爲用戶數據從來不會流經NameNode。

 

整體架構


1

假設和目標

硬件失效

硬件失效是常態而不是特例。一個HDFS集羣可能包含了成百上千的服務器,每個都會存儲文件系統的部分數據。而大量的組件就會導致組件出錯的概率非常高,而這也意味着HDFS的部分組件會經常不工作。因此,檢查缺陷和快速自動地恢復就成了HDFS的核心架構目標。

流式數據訪問

運行在HDFS上的應用程序需要流式訪問數據集的能力。它們不是普通的運行在普通文件系統上的程序。HDFS被設計用來應對批量計算的場景,而不是用來和用戶交互。重點是數據訪問的高吞吐而不是低延遲。POSIX引入了大量的硬性需求來約束應用程序,而這些需求不是HDFS的目標需求。POSIX語義在一些關鍵領域被認爲可以提高數據吞吐率。

大規模數據集

運行在HDFS上的程序擁有大規模的數據集。一個HDFS文件可能是GB級別或是TB級別的存儲。因此HDFS被調優爲存儲大文件。它應該提供高聚合的數據帶寬並且可以在單個集羣內擴展到其他的上百上千的節點。程序應該支持在單實例中存在千萬級別的文件。

簡單的一致性模型

HDFS程序需要一個一次寫入多次讀出的文件訪問模型。一旦一個文件被創建、寫入數據然後關閉,這個文件應該不再需要被改動。此假設簡化了數據一致性的問題,並且支持了數據的高吞吐。一個Map/Reduce程序或者一個網絡爬蟲程序就非常符合這種模型。未來有計劃支持對於文件的追加寫。

“遷移計算比遷移數據成本要低”

一個程序如果在運行計算任務時能更貼近其依賴的數據,那麼計算會更高效。尤其是在數據集規模很大時該效應更加明顯。因爲這會最小化網絡消耗而增加系統整體的吞吐能力。這一假設就是:把計算靠近數據要比把數據靠近計算成本更低。HDFS提供給應用程序接口來做到移動程序使其離數據更近。

跨異構硬件軟件平臺的可移植性

HDFS被設計爲可以很容易的從一個平臺移植到另一個平臺。這有利於推廣HDFS,使其作爲廣泛首選的大數據集應用的平臺。

 

HDFS文件訪問方式


replication(複製因子):定義了每份數據保存幾個副本,可以在hdfs-core.xml配置文件中設置,默認值是 3。

1. 命令行訪問:

上傳文件到hdfs:       hdfs dfs –put /localfile /hdfsdir

從hdfs拉文件到本地: hdfs dfs –get  /hdfsdir /localfile

查看文件: hdfs dfs –ls /

創建目錄: hdfs dfs –mkdir /newDir

2. http

         通過http方式訪問hdfs有兩種方式:

         a) 直接訪問: 主要是訪問namenode和datanode內嵌的web服務器作爲WebHDFS的端節點運行(由於dfs.webhdfs.enabled被設置爲true,WebHDFS默認是啓用狀態)。 文件元數據由namenode管理,文件讀寫操作首先被髮往 namenode,由namenode發送一個http重定向至某個客戶端,指示以流方式傳輸文件數據的目的或源datanode。

         b) 依靠一個或者多個代理服務器http訪問hdfs。(由於代理服務是無狀態的,因此可以運行在標準的負載均衡器之後。)

3. NFS

      使用hadoop的NFSv3網關將HDFS掛載爲本地客戶端的文件系統,然後你可以使用Unix實用程序(ls和cat)與該文件系統交互。

4. C語言 

       提供訪問hdfs的c語言庫。

 

Java接口

      待補充

 

參考:

《hadoop權威指南》

http://hadoop.apache.org/docs/r2.6.4/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章