hadoop技術探索之二

本章之後,將對hadoop生態系統各個服務組件進行整理介紹和分析應用。

下面先對hadoop的基礎hdfs文件系統進行介紹。

一、HDFS簡介

hadoop的分佈式文件系統,提供海量數據存儲和訪問。它與現有的分佈式文件系統有很多相似地方,也有很多不同與其他分佈式文件系統的有價值的地方。它能夠提供高容錯機制,能夠運行在廉價計算機硬件上。它能爲應用數據訪問提供高吞吐量,非常適合擁有龐大數據集的應用。HDFS放寬了一些POSIX要求,使其能夠以流式方式訪問文件系統數據。HDFS最開始作爲Apache Nutch項目的基礎設施。現在是Apache hadoop的核心項目的一部分。

高容錯性是HDFS設計的核心。HDFS強調的是高吞吐量而非低延遲。HDFS文件是“一次寫入多次讀取”訪問方式,只能夠在文件末尾追加,不能夠在任意位置修改文件。HDFS爲應用提供了接口來遷移應用自身到數據所在地附近。

HDFS特點:

  1. 超大存儲。能存儲數以百萬計的文件,每個文件大小可以超過10GB,總存儲量達10PB級。
  2. 低廉。使用廉價的商業服務器實現大規模存儲。通過應用級數據複製實現高可用性及高吞吐量。
  3. 批處理。更擅長流式讀寫大文件,而不擅長低延遲訪問大量小文件。更注重批處理,而非交互響應的時間。
  4. 優雅的處理機器和磁盤故障。
  5. 支持MapReduce處理。

二、NameNode和DataNode

HDFS是Master/Slave結構。

NameNode(簡稱NN)是HDFS的管理者,它管理HDFS文件系統的命名空間,以及控制客戶端訪問文件。DataNode(簡稱DN)是管理該節點的數據存儲。一個HDFS文件會被劃分爲多個block,分別存儲到多個DN節點上。NN執行對文件系統名字空間的操作,並管理着文件的blocks到DNs的映射。DN響應來至客戶端的讀寫請求。DN執行block的創建、刪除,以及來至NN的複製指令。

HDFS文件系統結構如下圖:


NameNode作用:

  1. 保存系統名字空間的元數據信息,這些信息保存在fsimage(文件系統鏡像文件)、edit(編輯日誌文件)。
  2. 接收DN心跳。
  3. 接收DN上報block位置信息,NN不會永久保存block的位置信息,每次系統啓動時DN都會上報這些信息給NN。
  4. HDFS目錄配額。
  5. 文件訪問權限控制。
  6. 保存文件複製因子。控制DN複製block副本。
  7. 響應客戶端請求。
  8. 驗證客戶端身份。

在系統啓動時,NN會進入安全模式,該模式下不會進行數據塊的複製。NN會接收DN心跳及上報的block位置信息。如果一個block的副本數達到了NN記錄的最小副本數,則認爲該block是安全的,當安全的block佔所有block的百分比達到NN記錄的安全百分比時,且安全的DN數達到配置的值時,NN會繼續等待一小段時間默認是30s纔會退出安全模式。然後NN會針對那些沒有達到最小副本數的block,將其複製到其它DN上。如果NN無法退出安全模式,就需要使用hdfs fsck命令檢查哪些block有問題,然後將有問題的文件刪除,才能解決啓動時無法退出安全模式的問題。

安全模式相關一些配置:

  1. dfs.namenode.replication.min,安全block要求的最小副本數。
  2. dfs.namenode.safemode.threshold-pct,安全的block佔總block數的百分比,默認0.999f。如果達到1則永遠退不出安全模式;如果配置小於0,則表示不等待任何block達到安全要求。
  3. dfs.namenode.safemode.min.datanodes,離開安全模式時最小可用的DN數,默認是0。
  4. dfs.namenode.safemode.extension,單位是毫秒,表示當其他安全條件滿足時,再過一段時間依然滿足安全條件時,才退出安全模式。

NN所在主機如果損毀,整個HDFS文件系統將會損壞,且無法利用DN上的block進行重建。因此,HDFS提供了NN的容災機制:

 第一種是備份NN上的文件系統的元數據持久文件。通常做法是NN在寫元數據文件時,同時寫入一個掛載的遠程文件系統 (NFS)。

 第二種做法是部署SecondNameNode(簡稱SNN)。SNN的作用是,同步NN的fsimage及edit log文件,定期進行edit 日誌文件合併工作,生成新的fsimage文件,並將新的fsimage文件同步給NN。在NN損毀的情況下,可以使用SNN進行 恢復,但是由於SNN的狀態始終晚於NN,故通過SNN恢復的文件難免會有部分數據丟失的情況。這種情況一般會用NFS上 的元數據文件複製到SNN上,將SNN作爲新的NN。

DataNode的作用:

  1. 存儲block數據。
  2. 向NN發送心跳,報告自身狀態。
  3. 向NN發送block報告。
  4. 與客戶端交互,傳遞block數據或寫block。

客戶端讀HDFS文件流程概況:

  1. 客戶端連接NN,告訴NN需要讀哪個文件。
  2. NN驗證客戶端身份。
  3. 返回文件一個block的ID,以及該block所在的所有DN的列表,並將這些DN按與客戶端的距離進行排序。
  4. 客戶端選擇最合適的DN讀取block數據。
  5. 重複進行上面操作過程,直到所有block數據讀取完畢,或者是客戶端中斷讀取流。
客戶端寫HDFS文件流程概況:

  1. 客戶端連NN,告知需要寫文件。
  2. NN驗證客戶端身份及權限。
  3. NN創建文件元數據。
  4. NN響應客戶端,告訴客戶端可以開始寫文件。
  5. 客戶端將待上傳的文件劃分多個packet(按block大小劃分),並將這些packet放在內存隊列中。
  6. 客戶端另起線程從內存隊列中獲取一個packet,向NN要待寫入block的DN列表。
  7. NN根據複製因子數選擇一組DN給客戶端。
  8. 客戶端選擇列表中第一個DN連接。
  9. 第一個DN接收客戶端連接,連接列表中第二個DN,第二個DN連接第三個DN,依次類推,直到最後一個DN。
  10. 客戶端將packet傳遞個第一個DN。
  11. 第一個DN將packet寫進本地磁盤,然後將其傳遞給第二個DN,依次下去直到最後一個DN。
  12. 最後一個DN寫操作完成,返回給上一個DN寫成功響應,依次向上反饋,直到第一個DN反饋給客戶端寫成功。
  13. 客戶端重複進行6-12過程,直到隊列中所有packet都寫完成。當所有的packet的反饋消息都是成功的,則客戶端斷開流,並告知NN寫文件完成。
客戶端在寫文件過程中,如果複製管道中任何一個DN寫失敗,則這個管道的寫操作都會按失敗處理,以及寫完成的block作廢,最終被回收。寫失敗的packet被重新返回內存隊列中。

三、SecondNameNode

NN將HDFS文件系統的元數據保存在本地文件系統的磁盤上,這些元數據在不同的文件上,其中最爲重要的是fsimage和edits文件。文件系統的名字空間,包括塊到文件的映射、及文件系統的屬性等,均被記錄在fsimage文件裏。對於文件的操作,比如創建文件,修改本分因子等操作均會被記錄在edits文件裏。

NN會在內存中保存一份整個HDFS文件系統的名字空間及塊的映射。

當NN啓動,或checkpoint觸發時,NN就會從本地磁盤讀取fsimage及edits文件,將edits記錄的所有事物作用於內存中的fsimage鏡像,並生成新版本的fsimage文件保存在本地磁盤。然後NN會截斷edits文件。這個過程就是checkpoint。觸發checkpoint過程,可以通過配置dfs.namenode.checkpoint.period參數,單位是秒,表示checkpoint週期間隔時間。還可以通過配置dfs.namenode.checkpoint.txns參數,表示當文件系統的事務堆積到一定數量後就觸發checkpoint。

通常由於checkpoint過程消耗主機資源,爲了減輕NN的壓力,SNN(Secondary NameNode)就出現了。SNN作用就是代替NN執行checkpoint過程。通常SNN與NN在不同的主機上,內存配置與NN相同。SNN與NN之間的交互過程:

  1. SNN通知NN滾動edits文件,生成edits.new文件。
  2. SNN從NN拷貝fsimage及edits文件到本地checkpoint目錄。
  3. SNN加載fsimage到內存,並將edits作用於內存的fsimage,生成新的fsimage。
  4. SNN將新的fsimage文件壓縮到磁盤。
  5. SNN將新的fsimage文件傳遞給NN,NN採用最新的fsimage。
  6. NN將edits.new更名爲edits。

由上面過程可以看出,SNN在進行checkpoint過程時,NN會將這段期間的文件變更操作寫進edits.new文件裏,在SNN返回新的fsimage文件後,NN將其更名爲edits。這樣的話SNN的checkpoint總是會比NN要少一部分文件的變更,因此當NN損毀後,使用SNN恢復的文件系統將會缺少部分數據,這是不可避免的。

四、Checkpoint Node

由於SNN的名字容易讓人產生誤會,故而HDS又提供了CN(checkpoint node)。CN的作用是替代SNN進行NN的checkpoint過程。它所需要的配置與SNN一樣,同樣啓動在與NN不同的主機上。它的啓動命令是hdfs namenode -checkpoint。CN可以啓動多個。

五、Backup Node

BN同樣有checkpoint能力。但同時它的內存中維持着與NN保持同步的文件系統的名字空間,是NN名字空間的一個備份。由於它始終與NN保持同步,因此它在checkpoint過程中不需要再特別從NN上下載fsimage及edits文件。由於BN在checkpoint時只需要將自己內存的名字空間狀態寫進本地磁盤並重置edits文件,因此BN將會比SNN及CN更加高效。

BN的內存要求與NN一致。目前一個NN只能支持一個BN,且使用BN後就不能使用CN。以後可能會同時支持多個BN。

BN的啓動命令hdfs namenode -backup。

BN也提供了自己的web配置參數dfs.namenode.backup.address及dfs.namenode.backup.http-address。

使用BN可以讓NN不需要持久存儲,需要在NN配置參數dfs.namenode.edits.dir,在NN啓動時使用-importCheckpoint命令就可以。

當NN損壞時,BN就可以當做新的NN使用。

六、Import checkpoint

SNN與CN都會將最後的checkpoint存儲在指定的目錄裏,其目錄結構與NN目錄結構相同。配置參數dfs.namenode.checkpoint.dir。當NN啓動時指定-importCheckpoint參數,則會從dfs.namenode.checkpoint.dir目錄裏將文件拷貝到dfs.namenode.name.dir文件目錄裏。如果dfs.namenode.name.dir裏已存在合法的fsimage文件,則導入操作就會報失敗。


發佈了33 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章