1. 程式人生 > >3.1 HDFS概述

3.1 HDFS概述

第3章 HDFS:分散式檔案系統

3.1 HDFS概述

在大資料時代,需要處理分析的資料集的大小已經遠遠超過了單臺計算機的儲存能力,需要將資料集進行分割槽(partition)並存儲到若干臺獨立自治計算機中。但是分割槽儲存的資料不方便管理和維護,迫切需要一種檔案系統來管理多臺機器上的檔案,這就是分散式檔案系統(distribute filesystem)。 
分散式檔案系統是一種允許檔案通過網路在多臺主機上分享的 檔案的系統,可讓多機器上的多使用者分享檔案和儲存空間。 
分散式檔案系統很多,比如HDFS。HDFS(Hadoop Distribute File System)是Hadoop的一個分散式檔案系統,Hadoop應用程式使用的主要分散式儲存。 HDFS叢集主要由一個NameNode來管理檔案系統元資料和儲存實際資料的DataNodes。

3.1.1 HDFS設計理念

一句話,HDFS設計理念是可以執行在普通機器上,以流式資料方式儲存檔案,一次寫入、多次查詢。

  • 可構建在廉價機器上 
    HDFS設計理念之一就是讓它能執行在普通的硬體之上,即便硬體出現故障,也可以通過容錯策略來保證資料的高可用。通過多副本提高可靠性,提供了容錯和恢復 機制。
  • 高容錯性 
    由於HDFS可以建立在普通計算機上,節點故障是正常事情。HDFS將資料自動儲存多個副本,副本丟失後,自動恢復,實現資料高容錯性。
  • 適合批處理 
    也稱為流式資料訪問。HDFS適合一次寫入、多次查詢(讀取)的情況。在資料集生成後,長時間在此資料集上進行各種分析。每次分析都將設計該資料集的大部分資料甚至全部資料,因此讀取整個資料集的時間延遲比讀取第一條記錄的時間延遲更重要。
  • 適合儲存大檔案 
    這裡說的大檔案包含兩種意思:一是值檔案大小超過100M以及達到GB甚至TB、PB的檔案。二是百萬規模以上的檔案數量。

3.1.2 HDFS 的侷限

沒有完美的系統,HDFS也存在一些短板。

  • 實時性差 
    要求低時間延遲的訪問的應用,不適合在HDFS上執行。記住,HDFS是為高資料吞吐量應用優化的,這可能會以高時間延遲為代價。目前,對於低延遲的訪問需求,hbase是更好的選擇。
  • 小檔案問題 
    由於nameNode將檔案系統的元資料儲存在記憶體中,因此該檔案系統所能儲存的檔案總量受限於nameNode的記憶體總容量。根據經驗,每個檔案、目錄和資料塊的儲存資訊大約佔150位元組。過多的小檔案儲存會大量消耗nameNode的儲存量。
  • 檔案修改問題 
    HDFS中的檔案只有一個Writer,而且寫操作總是將資料新增在檔案的末尾(實際上,許多HDFS應用也不允許檔案的追加操作)。他不支援具有多個寫入者的操作,也不支援在檔案的任意位置進行修改。

3.1.3 HDFS架構

http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html 
如圖1所示,HDFS是一個主從結構,一個HDFS叢集是由一個管理節點NameNode,它是一個管理檔案名稱空間和調節客戶端訪問檔案的主伺服器,還有一些資料節點DataNode,通常是一個節點一個機器,它來管理對應節點的儲存。 
這裡寫圖片描述
圖1 HDFS架構

  • NameNode 
    NameNode負責管理檔案目錄、檔案和block的對應關係以及block和datanode的對應關係。NameNode節點也成為元資料節點,用來管理檔案系統的名稱空間,維護目錄樹,接管使用者的請求。 
    (1) 將檔案的元資料儲存在一個檔案目錄樹中 
    (2) 在磁碟上儲存為:fsimage 和 edits 
    (3) 儲存datanode的資料資訊的檔案,在系統啟動的時候讀入記憶體。
  • DataNode 
    Datanode是檔案系統的工作節點。他們根據需要儲存並檢索資料塊(受客戶端或namenode排程),並且定期向nameNode傳送他們所儲存的塊的列表。

  • Client(客戶端) 
    客戶端代表使用者通過與nameNode和datanode互動來訪問整個檔案系統。客戶端提供了一個類似於POSIX(可移植作業系統介面)的檔案系統介面,因此使用者在程式設計時無需知道nameNode和datanode也可以實現其功能。 
    HDFS對外開放檔案名稱空間並允許使用者資料以檔案形式儲存。使用者通過客戶端(Client)與HDFS進行通訊互動。

  • SecondnameNode 
    檔案系統客戶端在執行寫操作時,這些操作首先被記錄到編輯日誌中,然後更新nameNode記憶體中維護的檔案系統的元資料;名稱空間映象檔案(fsimage)是檔案系統元資料的一個永久檢查點,因為fsimage檔案是一個大型檔案,如果頻繁的執行寫操作,會使系統執行極為緩慢。但是如果不進行操作,editlog檔案會無限增長,一旦nameNode需要恢復,則需要花費非常長的時間,所以HDFS引入了輔助nameNode,如圖2所示,為主nameNode記憶體中的檔案系統元資料建立檢查點。如圖3所示,實現將主nameNode的編輯日誌和名稱空間映象檔案合併。形成一個更小的editlog檔案和最新的fsimage檔案。

這裡寫圖片描述
圖2 HDFS架構

客戶端執行寫操作的時候,首先更新編輯日誌(edits),然後修改記憶體中的檔案系統對映。隨著時間的推移,編輯日誌會非常大。這個時候,就需要將編輯日誌和檔案系統對映持久檢查點(fsimage)進行合併,以減少編輯日誌的大小。這個工作就是由輔助namenode完成的。 
這裡寫圖片描述
圖3 輔助namenode工作原理

①輔助namenode請求主namenode停止使用edits檔案,暫時將新的寫操作記錄到一個新的檔案中;

②輔助namenode從主namenode獲取fsimage和edits檔案(通過http get)

③輔助namenode將fsimage檔案載入記憶體,逐一執行edits檔案中的操作,建立新的fsimage檔案。

④輔助namenode將新的fsimage檔案傳送回主namenode(使用http post).

⑤主namenode用從輔助namenode接收的fsimage檔案替換舊的fsimage檔案;用步驟1所產生的edits檔案替換舊的edits檔案。同時,還更新fstime檔案來記錄檢查點執行時間。

最終,主namenode擁有最新的fsimage檔案和一個更小的edits檔案。當namenode處在安全模式時,管理員也可呼叫hadoop dfsadmin –saveNameSpace命令來建立檢查點。

從上面的過程中我們清晰的看到輔助namenode和主namenode擁有相近記憶體需求的原因(因為輔助namenode也把fsimage檔案載入記憶體)。因此,在大型叢集中,輔助namenode需要執行在一臺專用機器上。

建立檢查點的觸發條件受兩個配置引數控制。通常情況下,輔助namenode每隔一小時(有fs.checkpoint.period屬性設定)建立檢查點;此外,當編輯日誌的大小達到64MB(有fs.checkpoint.size屬性設定)時,也會建立檢查點。系統每隔五分鐘檢查一次編輯日誌的大小。

3.1.4 塊

HDFS內部機制是將一個檔案分割成一個或多個塊,這些塊被儲存在一組資料節點中。NameNode節點用來操作檔案名稱空間的檔案或目錄操作,如開啟,關閉,重新命名等等。它同時確定塊與資料節點DataNode的對映。資料節點DataNode負責來自檔案系統客戶的讀寫請求。資料節點DataNode同時還要執行塊的建立,刪除,和來自NameNode的塊複製指令。 
這裡寫圖片描述

dfs.blocksize是一個檔案塊的大小了,預設128M。 
每一個block會在多個datanode上儲存多份副本,預設是3份。 
太大的話會有較少map同時計算,太小的話也浪費可用map個數資源,而且檔案太小namenode就浪費記憶體多。根據需要進行設定。

這裡寫圖片描述

第3章 HDFS:分散式檔案系統

3.1 HDFS概述

在大資料時代,需要處理分析的資料集的大小已經遠遠超過了單臺計算機的儲存能力,需要將資料集進行分割槽(partition)並存儲到若干臺獨立自治計算機中。但是分割槽儲存的資料不方便管理和維護,迫切需要一種檔案系統來管理多臺機器上的檔案,這就是分散式檔案系統(distribute filesystem)。 
分散式檔案系統是一種允許檔案通過網路在多臺主機上分享的 檔案的系統,可讓多機器上的多使用者分享檔案和儲存空間。 
分散式檔案系統很多,比如HDFS。HDFS(Hadoop Distribute File System)是Hadoop的一個分散式檔案系統,Hadoop應用程式使用的主要分散式儲存。 HDFS叢集主要由一個NameNode來管理檔案系統元資料和儲存實際資料的DataNodes。

3.1.1 HDFS設計理念

一句話,HDFS設計理念是可以執行在普通機器上,以流式資料方式儲存檔案,一次寫入、多次查詢。

  • 可構建在廉價機器上 
    HDFS設計理念之一就是讓它能執行在普通的硬體之上,即便硬體出現故障,也可以通過容錯策略來保證資料的高可用。通過多副本提高可靠性,提供了容錯和恢復 機制。
  • 高容錯性 
    由於HDFS可以建立在普通計算機上,節點故障是正常事情。HDFS將資料自動儲存多個副本,副本丟失後,自動恢復,實現資料高容錯性。
  • 適合批處理 
    也稱為流式資料訪問。HDFS適合一次寫入、多次查詢(讀取)的情況。在資料集生成後,長時間在此資料集上進行各種分析。每次分析都將設計該資料集的大部分資料甚至全部資料,因此讀取整個資料集的時間延遲比讀取第一條記錄的時間延遲更重要。
  • 適合儲存大檔案 
    這裡說的大檔案包含兩種意思:一是值檔案大小超過100M以及達到GB甚至TB、PB的檔案。二是百萬規模以上的檔案數量。

3.1.2 HDFS 的侷限

沒有完美的系統,HDFS也存在一些短板。

  • 實時性差 
    要求低時間延遲的訪問的應用,不適合在HDFS上執行。記住,HDFS是為高資料吞吐量應用優化的,這可能會以高時間延遲為代價。目前,對於低延遲的訪問需求,hbase是更好的選擇。
  • 小檔案問題 
    由於nameNode將檔案系統的元資料儲存在記憶體中,因此該檔案系統所能儲存的檔案總量受限於nameNode的記憶體總容量。根據經驗,每個檔案、目錄和資料塊的儲存資訊大約佔150位元組。過多的小檔案儲存會大量消耗nameNode的儲存量。
  • 檔案修改問題 
    HDFS中的檔案只有一個Writer,而且寫操作總是將資料新增在檔案的末尾(實際上,許多HDFS應用也不允許檔案的追加操作)。他不支援具有多個寫入者的操作,也不支援在檔案的任意位置進行修改。

3.1.3 HDFS架構

http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html 
如圖1所示,HDFS是一個主從結構,一個HDFS叢集是由一個管理節點NameNode,它是一個管理檔案名稱空間和調節客戶端訪問檔案的主伺服器,還有一些資料節點DataNode,通常是一個節點一個機器,它來管理對應節點的儲存。 
這裡寫圖片描述
圖1 HDFS架構

  • NameNode 
    NameNode負責管理檔案目錄、檔案和block的對應關係以及block和datanode的對應關係。NameNode節點也成為元資料節點,用來管理檔案系統的名稱空間,維護目錄樹,接管使用者的請求。 
    (1) 將檔案的元資料儲存在一個檔案目錄樹中 
    (2) 在磁碟上儲存為:fsimage 和 edits 
    (3) 儲存datanode的資料資訊的檔案,在系統啟動的時候讀入記憶體。
  • DataNode 
    Datanode是檔案系統的工作節點。他們根據需要儲存並檢索資料塊(受客戶端或namenode排程),並且定期向nameNode傳送他們所儲存的塊的列表。

  • Client(客戶端) 
    客戶端代表使用者通過與nameNode和datanode互動來訪問整個檔案系統。客戶端提供了一個類似於POSIX(可移植作業系統介面)的檔案系統介面,因此使用者在程式設計時無需知道nameNode和datanode也可以實現其功能。 
    HDFS對外開放檔案名稱空間並允許使用者資料以檔案形式儲存。使用者通過客戶端(Client)與HDFS進行通訊互動。

  • SecondnameNode 
    檔案系統客戶端在執行寫操作時,這些操作首先被記錄到編輯日誌中,然後更新nameNode記憶體中維護的檔案系統的元資料;名稱空間映象檔案(fsimage)是檔案系統元資料的一個永久檢查點,因為fsimage檔案是一個大型檔案,如果頻繁的執行寫操作,會使系統執行極為緩慢。但是如果不進行操作,editlog檔案會無限增長,一旦nameNode需要恢復,則需要花費非常長的時間,所以HDFS引入了輔助nameNode,如圖2所示,為主nameNode記憶體中的檔案系統元資料建立檢查點。如圖3所示,實現將主nameNode的編輯日誌和名稱空間映象檔案合併。形成一個更小的editlog檔案和最新的fsimage檔案。

這裡寫圖片描述
圖2 HDFS架構

客戶端執行寫操作的時候,首先更新編輯日誌(edits),然後修改記憶體中的檔案系統對映。隨著時間的推移,編輯日誌會非常大。這個時候,就需要將編輯日誌和檔案系統對映持久檢查點(fsimage)進行合併,以減少編輯日誌的大小。這個工作就是由輔助namenode完成的。 
這裡寫圖片描述
圖3 輔助namenode工作原理

①輔助namenode請求主namenode停止使用edits檔案,暫時將新的寫操作記錄到一個新的檔案中;

②輔助namenode從主namenode獲取fsimage和edits檔案(通過http get)

③輔助namenode將fsimage檔案載入記憶體,逐一執行edits檔案中的操作,建立新的fsimage檔案。

④輔助namenode將新的fsimage檔案傳送回主namenode(使用http post).

⑤主namenode用從輔助namenode接收的fsimage檔案替換舊的fsimage檔案;用步驟1所產生的edits檔案替換舊的edits檔案。同時,還更新fstime檔案來記錄檢查點執行時間。

最終,主namenode擁有最新的fsimage檔案和一個更小的edits檔案。當namenode處在安全模式時,管理員也可呼叫hadoop dfsadmin –saveNameSpace命令來建立檢查點。

從上面的過程中我們清晰的看到輔助namenode和主namenode擁有相近記憶體需求的原因(因為輔助namenode也把fsimage檔案載入記憶體)。因此,在大型叢集中,輔助namenode需要執行在一臺專用機器上。

建立檢查點的觸發條件受兩個配置引數控制。通常情況下,輔助namenode每隔一小時(有fs.checkpoint.period屬性設定)建立檢查點;此外,當編輯日誌的大小達到64MB(有fs.checkpoint.size屬性設定)時,也會建立檢查點。系統每隔五分鐘檢查一次編輯日誌的大小。

3.1.4 塊

HDFS內部機制是將一個檔案分割成一個或多個塊,這些塊被儲存在一組資料節點中。NameNode節點用來操作檔案名稱空間的檔案或目錄操作,如開啟,關閉,重新命名等等。它同時確定塊與資料節點DataNode的對映。資料節點DataNode負責來自檔案系統客戶的讀寫請求。資料節點DataNode同時還要執行塊的建立,刪除,和來自NameNode的塊複製指令。 
這裡寫圖片描述

dfs.blocksize是一個檔案塊的大小了,預設128M。 
每一個block會在多個datanode上儲存多份副本,預設是3份。 
太大的話會有較少map同時計算,太小的話也浪費可用map個數資源,而且檔案太小namenode就浪費記憶體多。根據需要進行設定。

這裡寫圖片描述