1. 程式人生 > >Hadoop生態系統之HDFS

Hadoop生態系統之HDFS

一、介紹

HDFS : 分散式檔案系統(distributed filesystem),主從結構。

             以流式資料訪問模式來儲存超大檔案,運行於商用硬體叢集上。

超大檔案: 幾百M,幾百G,甚至幾百TB大小的檔案。

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

                    此讀取整個資料集的延遲比讀取一條資料的延遲更為重要)

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

二、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權威指南》