天天看點

分布式HeadLoop

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

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

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

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

     HDFS的設計能夠解決一些其他的分布式系統,例如 NFS,所無能為力的問題。尤其是在以下一些方面:

HDFS的設計 能夠存儲海量的資料(通常是TB或PB),這要求将資料分散的存儲在多台機器上。并且它所支援的檔案大小比NFS所支援的要大很多。

HDFS能夠可靠的存儲資料,也即是說叢集裡面的個别機器的故障将不會影響到資料的使用。

HDFS能夠提供對資料快速的、可擴充的通路。它能夠通過簡單的往叢集裡面加一台機器的做法來解決大量用戶端同時通路的問題。

HDFS很好的跟Hadoop MapReduce程式設計模型結合,盡可能的讓資料的計算和讀取操作在同一台機器上執行。

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

使用HDFS的應用程式讀取檔案的方式被假定為流式讀取。HDFS在流式讀取的性能上做了些優化,當然這也就意味着,在檔案上進行随機讀取的操作的時間将會比較長。

HDFS的資料被設計成隻允許一次寫入和多次讀取操作。當寫入操作被關閉後,想要往檔案裡面更新一些内容是不受支援。(最近的Hadoop0.19将會支援在檔案尾部增加資料。

由于存儲的檔案過大,以及它流式讀取方式,系統沒有提供緩存的功能。

假定,個别機器的永久性崩潰和間歇性故障總是會頻繁的發生。叢集應該能夠承受多台機器的故障,就算它們一起發生。叢集的性能将會按照所損失的機器的數量的比例減少,整個系統不會一下慢下來,資料也不會丢失。資料備份能夠起到作用。

    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的工作量是相當的小的,它發生故障的機率要比其他機器發生故障的機率小得多了。

繼續閱讀