Hadoop分佈式文件系統

但數據集的大小超過一臺獨立物理計算機的存儲能力時,就有必要對它進行分區並存儲到若干臺單獨的計算機上。管理網絡上跨多臺計算機存儲的文件系統稱為分佈式文件系統。

Hadoop的核心是HDFS和Map-Reduce,兩者只是理論基礎,不是什麼具體可使用的高級應用。

Hadoop有一個稱為HDFS的分佈式系統(Hadoop Distributed FileSystem)

HDFS

HDFS以流式數據訪問模式來存儲超大文件,它是谷歌的GFS提出之後出現的另外一種文件系統,它有一定高度的容錯性,而且提供了高吞吐量的數據訪問,非常適合大規模數據集上的應用。其設計特點為

大數據文件

文件分塊存儲

HDFS會將一個完整的大文件平均分塊存儲到不同計算器上,它的意義在於讀取文件時可以從多個主機讀取不同區塊的文件,多主機讀取比單主機讀取效率要高得多。

硬件故障

HDFS認為所有計算機都可能會出問題,為了防止某個主機失效讀取不到該主機的塊文件,它將同一個文件塊副本分配到其它某幾個主機上,如果其中一臺主機失效,可以迅速找另一塊副本取文件。

流式數據訪問:

HDFS的構建思路是這樣的:一次寫入,多次讀取是最高效的訪問模式。每次數據分析都涉及該數據集的大部分數據甚至全部,因此讀取整個數據集的時間延遲比讀取第一條記錄的時間延遲更重要。

廉價硬件:

Hadoop並不需要運行在昂貴可靠的硬件上,它是設計運行在商用硬件的集群上的。因此對於龐大的集群來說,節點故障的幾率還是非常高的。HDFS遇到上述故障時,被設計成能夠繼續運行且不讓用戶察覺到明顯的中斷。

低時間延遲的數據訪問:

要求低時間延遲數據訪問的應用,不適合在HDFS上運行。HDFS是為高數據吞吐量應用優化的,這可能會以高時間延遲為代價。

大量的小文件:

由於namenode將文件系統的元數據存儲在內存中,所以因此該文件系統能夠存儲的文件總數受限於namenode的內存容量

多用戶寫入,任意修改文件:

HDFS中的文件可能只有一個writer,而且寫操作總是將數據添加到文件的末尾。它不支持具有多個寫入者的操作,也不支持在文件的任意位置進行修改。

HDFS優點

高吞吐量訪問:HDFS的每個block分佈在不同的rack上,在用戶訪問時,HDFS會計算使用最近和訪問量最小的服務器給用戶提供。由於block在不同的rack上都有備份,所以不再是單數據訪問,所以速度和效率是非常快的。另外HDFS可以並行從服務器集群中讀寫,增加了文件讀寫的訪問帶寬。

高容錯性:上面簡單的介紹了一下高度容錯。系統故障是不可避免的,如何做到故障之後的數據恢復和容錯處理是至關重要的。HDFS通過多方面保證數據的可靠性,多分複製並且分佈到物理位置的不同服務器上,數據校驗功能、後臺的連續自檢數據一致性功能,都為高容錯提供了可能。

容量擴充:因為HDFS的block信息存放到namenode上,文件的block分佈到datanode上,當擴充的時候,僅僅添加datanode數量,系統可以在不停止服務的情況下做擴充,不需要人工干預。

HDFS的關鍵元素

block:

HDFS也有塊的概念,默認為64MB,與單一磁盤上的文件系統相似,HDFS上的文件也被劃分為塊大小的多個分塊,作為獨立的存儲單元。

對分佈式文件系統中的塊進行抽象會帶來很多好處:

文件的所有塊並不需要存儲在同一個磁盤上,因此它們可以利用集群上的任意一個磁盤進行存儲。

塊非常適用於數據備份進而提供數據容錯能力和可用性。將每個塊複製到少數幾個獨立的機器上(默認為3個)。可以確保在發生塊,磁盤或機器故障後數據不丟失。如果發現一個快不可用,系統會從其他地方讀取另一個副本,而這個過程對於用戶來說是透明的。一個因損壞或機器故障而丟失的塊可以從其他候選地點複製到另一臺可以正常運行的機器上,以保證副本的數量回到正常水平。

namenode 和 datanode

HDFS集群有兩類節點,並以管理者-工作者模式運行,即一個namenode(管理者)和多個datanode(工作者)。namenode管理文件系統的命名空間,它維護著文件系統樹及整棵樹內所有的文件和目錄。這些信息以兩個文件形式永久保存在本地磁盤上。namenode也記錄著每個文件中各個塊所在的數據節點信息。

客戶端通過namenode與datanode交互來訪問整個文件系統。客戶端提供一個文件系統接口,因此用戶在編程時無需知道namenode和datanode也可實現其功能。

datanode是文件系統的工作節點,用於存儲block塊文件。它們根據需要存儲並檢索數據塊(受客戶端或namenode調度),並且定期向namenode發送它們所存儲的塊的列表。

MapReduce

將文件分佈式存儲到硬盤是第一步,而從海量數據中提取我們需要的內容就是MapReduce做的事了。其是一套從海量源數據提取分析元素最後返回結果集的編程模型。MapReduce的基本原理就是:將大的數據分析分成小塊逐個分析,最後再將提取出來的數據彙總分析,最終獲得我們想要的內容。當然怎麼分塊分析,怎麼做Reduce操作非常複雜,Hadoop已經提供了數據分析的實現,我們只需要編寫簡單的需求命令即可達成我們想要的數據。

Hadoop經典案例

詞典統計:對每次出現的詞,詞頻+1,。但是當數據量非常大時,沒辦法在內存中維護一個這麼大的字典,就需要map-reduce過程了。

大概是分為下面幾個環節:

Map階段:

主要完成key-value對生成,這裡是每看到一個單詞,就輸出(單詞,1)的kv對

排序階段

對剛才的kv對進行排序,這樣相同單詞就在一塊兒了

Reduce階段

對同一個單詞的次數進行彙總,得到(詞,頻次)對

Hadoop分佈式文件系統


分享到:


相關文章: