hadoop分布式系統(上)

2021-08-29 19:00:17 字數 2652 閱讀 6296

hdfs, the hadoop distributed file system, 是乙個分布式系統,它被設計用來儲存大資料量的資訊(通常是tb或pb),並提供對資料進行高吞吐量訪問的效能。檔案被儲存在多台機器中,確保系統的抗失效效能以及並行應用程式的高效。這篇文章主要介紹 hdfs的設計意圖、結構,並告訴讀者怎樣去使用它。

分布式系統被設計成可以儲存和管理大資料量的資訊的系統,並為這些資料提供對外的訪問功能(通過網路)。現在已經有許多的分布式系統用各種不同的方法解決了這個問題。

nfs,the network file system, 是目前最普遍的分布式系統。它也是還在使用的最老的分布式系統之一。它的設計是非常易懂的,但它也有許多的侷限性。nfs 為儲存在一台機器上的乙個邏輯卷提供遠端訪問。乙個nfs能夠讓它的本地檔案系統的一部分對其他的客戶端可見。然後,客戶端 會把這個遠端系統 加進 它們自己的 linux 檔案系統,然後就像 遠端系統在本地硬碟上一樣 去使用它。

這個模型的乙個主要的優點就是它的透明性。客戶端壓根兒不用知道它們是否在使用遠端系統。標準庫中的方法,例如 open(),close(),fread(),等等,會幫助我們使用在nfs上的檔案。

但是作為乙個分布式系統,它的功能並不是很強大。nfs 中的檔案始終都只是儲存在一台機器上。這就意味著,儲存的容量不可能超過那台機器的容量,並且 nfs 也不提供可靠性上的保證(比如 資料備份)。最後,因為 所有的資料都被儲存在一台機器上,那所有的客戶端都得跑到這台機器上來取資料。當很多客戶端同時跑過來的時候,伺服器可能會超負荷。而且,客戶端在每次處理資料之前,都必須跑到伺服器上去取資料。

hdfs的可擴充套件性,高效能也決定了它對應用程式的不同於其他分布式系統的苛刻要求。為了達到設計者的目的,設計者做了一些額外的限制設計和折中方案。主要有:

hdfs的設計是基於google的分布式系統gfs的,這裡是google發表的相關** 。

hdfs 是乙個塊結構的檔案系統;每個檔案都被分割成固定大小的檔案塊。這些塊根據資料儲存策略被分別儲存在一台或者多台機器上。集群中的機器,我們叫,datanode。乙個檔案能夠被分割成幾個檔案塊,這些檔案塊並不一定會被儲存在同一臺機器上,哪個塊存在哪個機器上是隨機的。由此,想要訪問乙個檔案,或許得要幾台機器一起合作才行。但是卻因此而獲得了儲存大檔案的能力,顯而易見,檔案能夠要求比單個硬碟更大的空間來儲存它。

如果乙個檔案的使用,需要多台機器的配合,那麼一台機器的故障將會導致該檔案的不可用。hdfs通過為檔案的每乙個塊都做備份的方式來解決這個問題(通常,有3個備份)。

圖 2.1: datanodes 儲存著檔案的檔案塊 ,備份的數量是2 。namenode 結點負責將檔名對映到檔案塊的id上。

多數塊結構的檔案系統使用4k或者8k 數量級別的塊大小。相比之下,hdfs的塊大小預設下是64mb---乙個大很多的數量級別。這個設計減少了hdfs持有的檔案塊的數量(檔案塊的容量大的時候,塊的數量就會相應的減少了)。這樣做更有利於流式讀取方式。顯而易見,hdfs 非常喜歡 特大的檔案,並且更喜歡流式地讀取它們。不像ntfs 或ext這樣的檔案系統,它們通常儲存很多的小檔案,hdfs更希望儲存適中數量的特大檔案,幾百m的、幾百g的。畢竟,乙個100m的檔案也才不過兩個檔案塊而已。在我們平常的計算機中,檔案通常是被隨機訪問的,應用程式可能會讀取乙個檔案的不同的幾個部分,這些部分通常不是連續的儲存在硬碟上的。相比之下,hdfs期望程式一次讀完整個檔案。這種做法剛好非常適合mapreduce程式設計的風格。也就是說,像平常使用一般分布式系統那樣去使用hdfs,不是乙個明智的選擇。

hdfs將檔案分成塊,並儲存在幾台機器上,這些檔案不可能被當成正常檔案系統的一部分了。在一台跑hadoop的機器上使用ls命令,返回的結果是linux系統的內容,而並不會包括任何儲存在hdfs系統裡面的檔案。hdfs是乙個建立在本地檔案系統之上的應用。hdfs的檔案(更確切的說,組成檔案的那些檔案塊) 被儲存在 datanode 結點的乙個特定的目錄下,但這些檔案塊只有id。所以,你根本就沒有辦法使用linux 檔案系統的一些工具(ls,cp,mv等等)去操作這些檔案。不用操心,hdfs 自帶了檔案管理功能,操作起來跟(ls,cp,mv)等命令一樣地簡單。

資料的可靠性是相當重要的。hdfs的資料被設計成只允許一次寫入和多次讀取操作,當大量的客戶端同時需要對檔案目錄進行修改的時候,同步工作就顯得異常重要了。所以,對檔案目錄的維護由單獨的一台機器來完成,這台機器我們稱之為namenode。namenode將會儲存 檔案系統的檔案目錄和檔名稱。因為,每個檔案需要記錄的東西是很少的(例如,檔名、許可權、檔案塊的位置等),所以,所有的資料都可以被儲存在一台機器上,並提供快速的訪問功能。

假設,客戶端要訪問檔案a。客戶端從namenode中取得組成檔案a的檔案塊的位置列表。這個列表知道檔案塊被儲存在哪台機器上。然後客戶端 直接 從datanode上讀取檔案資料。namenode是不參與檔案的傳輸的,我們要保證namenode的消耗盡可能的小。

當然,我們還有預防namenode機器崩潰的情況。我們使用冗餘來保證檔案系統的資料不會丟失,即使是在namenode忽然崩潰的情況下。顯然,namenode的崩潰要比集群裡面的任何一台datanode的崩潰要嚴重得多了。當一台datanode故障的時候,整個集群還可以繼續執行,但當namenode故障的時候,集群就無法執行了,這時候,我們得手動的採取措施修復故障。當然,namenode的工作量是相當的小的,它發生故障的概率要比其他機器發生故障的概率小得多了。

關於hdfs的設計與實現,下面的這篇文章闡述的更加詳細。document

Hadoop分布式系統架構詳解

主要思想是 分組合併 思想。分組 比如 有乙個大型資料,那麼他就會將這個資料按照演算法分成多份,每份儲存在 從屬主機上,並且在從屬主機上進行計算,主節點主要負責hadoop兩個關鍵功能模組hdfs map reduce的監督。合併 將每個機器上的計算結果合併起來 再在一台機器上計算,得到最終結果。這...

hadoop分布式安裝

工欲善其事,必先利其器。在資料橫行的時代,我們的大神hadoop 出來了,作為分布式處理資料 不但快,而且一般用配置不高的電腦業可以做集群。那麼,現在就開始安裝我們的hadoop 進入hadoop之旅 檔案,這裡就去 apache 的命令進行解壓 tar zxvf hadoop x.tar.gz 好...

hadoop分布式快取

概念 使用distributedcache方法 1.在main方法中載入共享檔案的hdfs路徑,路徑可以是目錄也可以是檔案。可以在路徑中末位追加 別名,在map階段可以使用該別名 string cache hdfs cache cache myfile myfile是別名job.addcachefi...