1. 程式人生 > >分散式儲存系統HDFS(特詳細)

分散式儲存系統HDFS(特詳細)

Hadoop基礎

Hadoop核心元件

1.分散式儲存系統HDFS(Hadoop Distributed File System)分散式儲存層




2.資源管理系統YARN(Yet Another Resource Negotiator)叢集資源管理層




3.分散式計算框架MapReduce分散式計算層

模式分類

1.單機模式(Standalone)
       單機模式是Hadoop的預設模式。當首次解壓Hadoop的原始碼包時,Hadoop無法瞭解硬體安裝環境,便保守地選擇了最小配置。在這種預設模式下所有3個XML檔案均為空。當配置檔案為空時,Hadoop會完全執行在本地。因為不需要與其他節點互動,單機模式就不使用HDFS,也不載入任何Hadoop的守護程序。該模式主要用於開發除錯MapReduce程式的應用邏輯。


2.偽分佈模式(Pseudo-Distributed Mode)
      偽分佈模式在“單節點叢集”上執行Hadoop,其中所有的守護程序都執行在同一臺機器上。該模式在單機模式之上增加了程式碼除錯功能,允許你檢查記憶體使用情況,HDFS輸入輸出,以及其他的守護程序互動。5個程序的介紹http://www.aboutyun.com/thread-7088-1-1.html


3.全分佈模式(Fully Distributed Mode)
Hadoop守護程序執行在一個叢集上。
評論:意思是說master上看到namenode,jobtracer,secondarynamenode可以安裝在master節點,也可以單獨安裝。slave節點能看到datanode和nodeManage

HDFS的起源

源於Google的GFS論文 發表於2003年10月  HDFS是GFS的克隆版!


什麼是GFS?    http://www.cnblogs.com/999-/p/7120490.html


GFS是一個可擴充套件的分散式檔案系統,用於大型的、分散式的、對大量資料進行訪問的應用。它運行於廉價的普通硬體上,並提供容錯功能。它可以給大量的使用者提供總體效能較高的服務。
GFS 也就是 google File System,Google公司為了儲存海量搜尋資料而設計的專用檔案系統。

HDFS

     HDFS(Hadoop Distributed File System,Hadoop 分散式檔案系統)是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS 能提供高吞吐量的資料訪問,適合那些有著超大資料集(largedata set)的應用程式。

核心
         NameNode 
         DataNode
         SecondaryNameNode(NameNode的快照)




HDFS是一個主從結構,一個HDFS叢集由一個名位元組點(NameNode)和多個數據節點(DataNode)組成。

HDFS的優點(設計思想)

1.高容錯性
        HDFS 認為所有計算機都可能會出問題,為了防止某個主機失效讀取不到該主機的塊檔案,它將同一個檔案塊副本分配到其它某幾個主機上,如果其中一臺主機失效,可以迅速找另一塊副本取檔案。
     資料自動儲存多個節點;
     備份丟失後,自動恢復。


2.海量資料的儲存
      非常適合上T 級別的大檔案或者一堆大資料檔案的儲存


3.檔案分塊儲存
       HDFS 將一個完整的大檔案平均分塊(通常每塊64M)儲存到不同計算機上,這樣讀取檔案可以同時從多個主機取不同區塊的檔案,多主機讀取比單主機讀取效率要高得多得多。

4.移動計算
        在資料儲存的地方進行計算,而不是把資料拉取到計算的地方,降低了成本,提高了效能!   


5.流式資料訪問
       一次寫入,並行讀取。不支援動態改變檔案內容,而是要求讓檔案一次寫入就不做變化,要變化也只能在檔案末新增內容。
  
6.可構建在廉價的機器上
        通過多副本提高可靠性,提供了容錯和恢復機制。HDFS 可以應用在普通PC 機上,這種機制能夠讓一些公司用幾十臺廉價的計算機就可以撐起一個大資料叢集。

NameNode

作用
  01.它是一個管理檔案的名稱空間
  02.協調客戶端對檔案的訪問
  03.記錄每個檔案資料在各個DataNode上的位置和副本資訊


檔案解析
   version  :是一個properties檔案,儲存了HDFS的版本號
   editlog   :任何對檔案系統資料產生的操作,都會被儲存!
   fsimage /.md5:檔案系統元資料的一個永久性的檢查點,包括資料塊到檔案的對映、檔案的屬性等
   seen_txid :非常重要,是存放事務相關資訊的檔案

什麼是FSImage和EditsLog

         HDFS是一個分散式檔案儲存系統,檔案分散式儲存在多個DataNode節點上。
 問題?
        01.一個檔案儲存在哪些DataNode節點?
        02.又存在DataNode節點的哪些位置?
這些描述了檔案儲存的節點,以及具體位置的資訊(元資料資訊(metadata))由NameNode節點來處理。隨著儲存檔案的增多,NameNode上儲存的資訊也會越來越多。
       03.HDFS是如何及時更新這些metadata的呢?


FsImage和Editlog是HDFS的核心資料結構。這些檔案的損壞會導致整個叢集的失效。因此,名位元組點可以配置成支援多個FsImage和EditLog的副本。任何FsImage和EditLog的更新都會同步到每一份副本中。 


EditLog檔案不斷變大的問題


01.在名稱節點執行期間,HDFS的所有更新操作都是直接到EditLog,一段時間之後,EditLog檔案會變得很大


02.雖然這對名稱節點執行時候沒有什麼明顯影響,但是,當名稱節點重啟時候,名稱節點需要先將FsImage裡面的所有內容映象到記憶體,然後一條一條地執行EditLog中的記錄,當EditLog檔案非常大的時候,會導致名稱節點啟動操作會非常的慢


解決方案:使用secondaryNameNode 

SecondaryNameNode

作用
      01.Namenode的一個快照,週期性的備份Namenode
      02.記錄Namenode中的metadata及其它資料
      03.可以用來恢復Namenode,並不能替代NameNode!


SecondaryNameNode

執行流程
01.SecondaryNameNode節點會定期和NameNode通訊,請求其停止使用EditLog,暫時將新的寫操作到一個新的檔案edit.new上來,這個操作是瞬間完成的。


02.SecondaryNameNode 通過HTTP Get方式從NameNode上獲取到FsImage和EditLog檔案並下載到本地目錄


03.將下載下來的FsImage 和EditLog載入到記憶體中這個過程就是FsImage和EditLog的合併(checkpoint)


04.合併成功之後,會通過post方式將新的FsImage檔案傳送NameNode上。


05.SecondaryNamenode 會將新接收到的FsImage替換掉舊的,同時將edit.new替換EditLog,這樣EditLog就會變小。 

DataNode
1.作用
  01.真實資料的儲存管理
  02.一次寫入,多次讀取(不修改)
  03.檔案由資料塊組成,Hadoop2.x的塊大小預設是128MB
  04.將資料塊儘量散佈到各個節點


2.檔案解析


   blk_<id>:HDFS的資料塊,儲存具體的二進位制資料
   blk_<id>.meta:資料塊的屬性資訊:版本資訊、型別資訊
  
可以通過修改hdfs-site.xml的dfs.replication屬性設定產生副本的個數!預設是3!


DataNode資料塊



檔案按大小被切分成若干個block,儲存到不同的節點上
1.x的預設資料塊大小64M 
2.x的預設資料塊大小128M 


預設情況下每個block有三個備份


在我們啟動服務之後我們關閉master的防火牆 然後在我們windows的瀏覽器上 進入  ip:50070  例如:192.168.1.10:50079


這裡可以更直接顯示 我們對檔案的操作

例如增刪改。。。

在shell上面我們除了一些常用的命令


這裡我們引入了一個 回收站的觀點

這裡我們需要配置東西

開啟HDFS的回收站功能

首先:執行stop-dfs.sh命令指令碼關閉HDFS

只需在namenode節點上的core-site.xml檔案中,新增如下兩個屬性:

<property>  
    <name>fs.trash.interval</name>  
    <value>10080</value>  
    <description>Number of minutes after which the checkpoint gets deleted. If zero, the trash feature is disabled.</description>  
</property>  
  
<property>  
    <name>fs.trash.checkpoint.interval</name>  
    <value>0</value>  
    <description>Number of minutes between trash checkpoints. Should be smaller or equal to fs.trash.interval. If zero, the value is set to the value of fs.trash.interval.</description>  
</property>  
屬性介紹

fs.trash.interval:丟進回收站中的檔案多久後(準確的說是多少分鐘後)會被系統永久刪除;這裡10080是7天;

fs.trash.checkpoint.interval:前後兩次檢查點的建立時間間隔(單位也是分鐘);新的檢查點被建立後,隨之舊的檢查點就會被系統永久刪除;

重啟HDFS,執行hadoop命令來刪除HDFS上的某個檔案或目錄:hadoop fs -rm -r /data

會提示/data被移動至:hdfs://yourcluster:9820/user/hadoop/.Trash/Current

如果你想直接刪除某個檔案,而不把其放在回收站,就要用到-skipTrash命令

例如:hadoop fs -rm -r -skipTrash /test

然後執行

hadoop fs -expunge的命令是清空回收站


完成