Hadoop分佈式文件系統(一)

分佈式文件系統

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

HDFS的設計

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

超大文件

「超大文件」在這裏指具備幾百MB、幾百GB甚至幾百TB大小的文件。目前已經有存儲PB級數據的Hadoop集羣了。 網絡

流式數據訪問

HDFS的構建思路是這樣的:一次寫入,屢次讀取是最搞高效的訪問模式。數據集一般由數據源生成或從數據源複製而來,接着長時間的在此數據集上進行各種分析。每次分析都將涉及該數據集的大部分數據甚至所有,所以讀取整個數據集的時間延遲比讀取第一條記錄的時間延遲更重要。 分佈式

商用硬件

Hadoop並不須要運行在昂貴且高可靠的硬件上。它是設計運行在商用硬件的集羣上的,所以至少對於龐大的集羣來講,節點故障的概率仍是很是高的。HDFS遇到上述故障時,被設計成可以繼續運行且不讓用戶察覺到明顯的中斷。 oop

低時間延遲的數據訪問

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

大量的小文件

因爲namenode將文件系統的元數據存儲在內存中,所以該文件系統所能存儲的文件總數受限於啊namenode的內存容量。每一個文件,目錄和數據塊的存儲信息大約150字節。舉例來講:若是有一百萬個文件,且每一個文件佔一個數據塊,那麼須要300MB內存。儘管存儲上百萬個文件是可行的,可是存儲十億個文件就超出了當前硬件的能力。 操作系統

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

HDFS中的文件可能只有一個writer,並且寫操做老是將數據添加在文件的末尾。它不支持具備多個寫入者的操做,也不支持在文件的任意位置進行修改。可能之後會支持這些操做,但它們相對比較低效。 設計

HDFS的概念

數據塊

HDFS中的數據塊默認是64MB,與單一磁盤上的文件系統類似,HDFS上的文件也被劃分爲塊大小的多個分塊,做爲獨立的存儲單元。但與其餘文件系統不一樣的是,HDFS中小與一個塊大小的文件不會佔據整個塊的空間。(HDFS的塊比磁盤塊大的目的是爲了最小化尋址開銷。) 日誌

與磁盤文件系統類似,HDFS中fsck指令能夠顯示塊信息。執行如下命令將列出文件系統中各個文件由哪些塊構成:hadoop fsck / -files blocks 接口

NameNode和DataNode

HDFS集羣有兩類節點,是主從結構模式運行,即一個namenode和多個datanode。

NameNode管理文件系統的命名空間。它維護着文件系統樹及整棵樹內全部的文件和目錄。這些信息以兩個文件形式永久保存在本地磁盤上:命名空間鏡像文件和編輯日誌文件。Namenode也記錄着每一個文件中各個塊所在的數據節點信息,但它並不永久保存塊的位置信息,由於這些信息會在系統啓動時由數據節點重建。

客戶端表明用戶經過與namenode和datanode交互來訪問整個文件系統。客戶端提供一個相似與POSIX(可移植操做系統界面)的文件系統接口,所以用戶在編程時無需知道namenode和datanode也可實現其功能。

DataNode是文件系統的工做節點。他們根據須要存儲並檢索數據塊(受客戶端或namenode調度),並按期向namenode發送他們所存儲的塊的列表。

namenode容錯問題

沒有namenode,文件系統將沒法使用。若是運行namenode服務的機器毀壞,文件系統上全部的文件將會丟失,由於咱們不知道如何根據datanode的塊來重建文件,爲此Hadoop提供了兩種機制(如今主要用第二種):

第一種機制是備份那些組成文件系統元數據持久狀態的文件。Hadoop能夠經過配置實用namenode在多個文件系統上保存原數據的持久狀態。這些寫操做是實時同步的,是原子操做。通常的配置是,將持久狀態寫入本地磁盤的同時,寫入一個遠程掛在的網絡文件系統NFS。

第二種是運行一個輔助namenode,SecondaryNameNode,它不能被用做namenode。SecondaryNameNode的重要做用是按期經過編輯日誌合併空間鏡像,以防止編輯日誌過大。通常SecondaryNameNode在另外一臺單獨的物理計算機上運行,由於它須要佔用大量的CPU時間與NameNode相同容量的內存來執行合併操做。它會保存合併後的命名空間鏡像的副本,並在namenode發生故障時啓用。可是secondaryNameNode保存的狀態老是滯後於主節點,因此當主節點失效時,不免會丟失部分數據。在這種狀況下,通常把存儲在NFS上的namenode元數據複製到secondaryNameNode並做爲新的主NameNode運行。

相關文章
相關標籤/搜索