一文帶你瞭解HDFS技術

shkstart發表於2022-01-10

Hadoop Distributed File System,即Hadoop分散式檔案系統)是hadoop生態系統的一個重要組成部分,是hadoop中的的儲存元件,在整個Hadoop中的地位非同一般,是最基礎的一部分,因為它涉及到資料儲存,MapReduce等計算模型都要依賴於儲存在HDFS中的資料。HDFS是一個分散式檔案系統,以流式資料訪問模式儲存超大檔案,將資料分塊儲存到一個商業硬體叢集內的不同機器上。

NameNdoe還負責對DataNode的狀態監控。DataNode定期向NameNode傳送心跳以及所儲存的塊的列表資訊。NameNode可以知道每個DataNode上儲存著哪些資料(Block資訊),DataNode是否存活,並可以控制DataNode啟動或是停止。若NameNode發現某個DataNode發生故障,會將其儲存的資料在其他DataNode機器上增加相應的備份以維護資料副本(預設為3,可在配置檔案中配置)保持不變。

DataNode
DataNode負責資料的實際儲存和讀/寫工作。HDFS會將檔案切割成固定大小的資料塊(Block),每個資料塊又以多副本的形式儲存在叢集上,如果出現故障導致某一副本丟失,那麼可以從其它副本恢復,預設保留3個副本。

客戶端上傳檔案過程

1)客戶端向NameNode請求上傳檔案

3)NameNode響應客戶端是否可以上傳檔案

5)NameNode查詢DataNodes狀態資訊(忙碌情況,遠近情況等)

7)客戶端請求與最近的一個DataNode節點(假設為datanode1)建立傳輸通道,並告知其還要傳給datanode2和datanode3。datanode1會請求與datanode2建立連線,datanode2會請求與datanode3建立連線。

9)客戶端收到通道建立成功的訊息後,開始向datanode1傳送block1的資料,以一個個package(64k)為單位透過通道向datanode1寫資料,datanode1收到資料會將其存在本地快取中,一邊向datanode2傳資料,一邊將快取中的資料儲存到磁碟上。

11)當一個block傳輸完成之後,客戶端再次請求namenode上傳第二個block


客戶端在上傳資料時,請求NameNode告訴其應該往哪幾個DataNode上傳副本。NameNode需要綜合考慮DataNode的可靠性,寫入頻寬,讀出頻寬等因素。預設情況下,在執行客戶端的那個節點上存放第1個副本,如果客戶端執行在叢集之外,則隨機選擇一個節點存放第1塊,但NameNode會盡量選擇那些情況好的DataNode(儲存不太滿,當時不太忙,頻寬比較高)。第2個副本存放在與第1個副本所在機架不同的另一個機架上的DataNode中(隨機選擇另一機架上的另一情況較好的DataNode),第3個副本存在與第2個副本相同機架但不同DataNode上。

客戶端下載檔案檔案

1)客戶端跟NameNode通訊,請求下載某個資料。

3)將資料所在的DataNode資訊返回給客戶端。

5)DataNode響應客戶端請求,將資料返回給客戶端。

NameNode與Secondary NameNode
因為NameNode上儲存著整個HDFS叢集上的所有後設資料資訊,如果NameNode當機,叢集將失去所有資料,因此NameNode的容錯機制十分重要,Hadoop為此提供了兩種機制。

第二種是執行一個輔助NameNode,被稱為Secondary NameNode(第二名稱節點)。Secondary NameNode的職責並不是作為NameNode的熱備份機,其主要作用是定期從NameNode拉取fsimage和editlog,並將兩者合併成新的fsimage,將新的fsimage返回給NameNode。這種方式,一方面可以避免NameNode上的編輯日誌過大,另一方面將合併操作放在Secondary NameNode上可以節省NameNode的cpu時間和記憶體,減輕NameNode的工作壓力,讓NameNode更專注於自己的本職工作。Secondary NameNode中儲存的fsimage資料總是會滯後於NameNode記憶體中的後設資料,所以在NameNode當機後,難免會有部分的資料丟失。

步驟詳解:

2)NameNode做準備。

4)Secondary NameNode將editlogs和fsimage載入到記憶體中,進行合併產生新的fsimage。

NameNode高可用(High Availability,HA)
即使將NameNode記憶體中的後設資料備份在多個檔案系統中,並透過Secondary NameNode的checkpoint功能防止NameNode的資料丟失,但依然無法實現NameNode的高可用。NameNode一旦失效,整個系統將無法提供服務,管理員透過冷啟動的方式讓新的NameNode上線需要一段等待的時間(幾十分鐘,甚至更長)。新的NameNode在響應服務前必須經歷以下以下步驟:將後設資料匯入記憶體;重做編輯日誌檔案;接收到足夠多的來自DataNode的資料塊報告並退出安全模式(資料塊的位置資訊不儲存在後設資料中,需要NameNode啟動時在DataNode向其彙報的塊資訊中獲取)。

1)主控伺服器由一主(Active NameNode,ANN)一從(Standby NameNode,SNN)兩臺伺服器構成。

3)ANN和SNN之間透過高可用的共享儲存系統保持資料一致(ANN將資料寫入共享儲存系統,SNN一直監聽共享系統,一旦資料發生改變就將其載入到自己記憶體中)

5)故障轉移控制器(Failover Contraller,FC),監控ANN和SNN的狀態,並不斷向ZK叢集彙報心跳資訊。

7)snn負責做checkpoint。

2)名稱空間中儲存的內容包括檔案或目錄的擁有者,修改日期,以及檔案被切分為哪幾個塊等資訊,但不包括塊到底是儲存在哪些datanode中的資訊(block位置資訊)。

4)datanode很好地支援水平擴充套件,但單一namenode受記憶體空間限制,使得HDFS中所能容納的最大檔案數量受到限制(一個大檔案和一個小檔案的後設資料所佔記憶體空間大小是基本相同,所以不適合存小檔案,會很快佔滿namenode的記憶體)。

6)單一namenode無法隔離來自不同客戶的請求(比如本地實驗時,對namenode的負載影響會導致正常使用者的訪問請求受到延遲等)

1)將一個大的名稱空間切割成若干子名稱空間,每個namenode管理名稱空間中的一部分(如一個namenode管理/user下的所有檔案,另一個管理/test下的所有檔案)。

3)所有datanode被所有namenode共享,還是擔任儲存資料的功能。每個資料塊的資訊儲存在唯一的某個資料塊池中。

5)每個datanode向所有的namenode傳送心跳和block資訊,每個namenode再根據自己的子名稱空間維護自己的資料塊池。

版權宣告:本文為原創文章,轉載請附上原文出處連結及本宣告。下載相關影片學習資料到尚矽谷官方網站。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27721058/viewspace-2851461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章