Hadoop中的HDFS的儲存機制

2021-08-13 20:09:47 字數 3779 閱讀 8269

hadoop中hdfs的儲存機制

hdfs(hadoop distributed file system)是hadoop分布式計算中的資料儲存系統,是基於流資料模式訪問和處理超大檔案的需求而開發的。下面我們首先介紹hdfs中的一些基礎概念,然後介紹hdfs中讀寫操作的過程,最後分析了hdfs的優缺點。

block:hdfs中的儲存單元是每個資料塊block,hdfs預設的最基本的儲存單位是64m的資料塊。和普通的檔案系統相同的是,hdfs中的檔案也是被分成64m一塊的資料塊儲存的。不同的是,在hdfs中,如果乙個檔案大小小於乙個資料塊的大小,它是不需要占用整個資料塊的儲存空間的。

namenode:元資料節點。該節點用來管理檔案系統中的命名空間,是master。其將所有的為了見和資料夾的元資料儲存在乙個檔案系統樹中,這些資訊在硬碟上儲存為了:命名空間映象(namespace image)以及修改日誌(edit log),後面還會講到。此外,namenode還儲存了乙個檔案包括哪些資料塊,分布在哪些資料節點上。然而,這些資訊不存放在硬碟上,而是在系統啟動的時候從資料節點收集而成的。

datanode:資料節點。是hdfs真正儲存資料的地方。客戶端(client)和元資料節點(namenode)可以向資料節點請求寫入或者讀出資料塊。此外,datanode需要週期性的向元資料節點回報其儲存的資料塊資訊。

secondary namenode:從元資料節點。從元資料節點並不是namenode出現問題時候的備用節點,它的主要功能是週期性的將namenode中的namespace image和edit log合併,以防log檔案過大。此外,合併過後的namespace image檔案也會在secondary namenode上儲存乙份,以防namenode失敗的時候,可以恢復。

edit log:修改日誌。當檔案系統客戶端client進行——寫——操作的時候,我們就要把這條記錄放在修改日誌中。在記錄了修改日誌後,namenode則修改記憶體中的資料結構。每次寫操作成功之前,edit log都會同步到檔案系統中。

fsimage:命名空間映象。它是記憶體中的元資料在硬碟上的checkpoint。當namenode失敗的時候,最新的checkpoint的元資料資訊就會從fsimage載入到記憶體中,然後注意重新執行修改日誌中的操作。而secondary namenode就是用來幫助元資料節點將記憶體中的元資料資訊checkpoint到硬碟上的。

checkpoint的過程如下:secondary namenode通知namenode生成新的日誌檔案,以後的日誌都寫到新的日誌檔案中。secondary namenode用http get從namenode獲得fsimage檔案及舊的日誌檔案。secondary namenode將fsimage檔案載入到記憶體中,並執行日誌檔案中的操作,然後生成新的fsimage檔案。secondary namenode將新的fsimage檔案用http post傳回namenode。namenode可以將舊的fsimage檔案及舊的日誌檔案,換為新的fsimage檔案和新的日誌檔案(第一步生成的),然後更新fstime檔案,寫入此次checkpoint的時間。這樣namenode中的fsimage檔案儲存了最新的checkpoint的元資料資訊,日誌檔案也重新開始,不會變的很大了。

在hdfs中,檔案的讀寫過程就是client和namenode以及datanode一起互動的過程。我們已經知道namenode管理著檔案系統的元資料,datanode儲存的是實際的資料,那麼client就會聯絡namenode以獲取檔案的元資料,而真正的檔案讀取操作是直接和datanode進行互動的。

寫檔案的過程:

客戶端呼叫create()來建立檔案distributedfilesystem用rpc呼叫元資料節點,在檔案系統的命名空間中建立乙個新的檔案。元資料節點首先確定檔案原來不存在,並且客戶端有建立檔案的許可權,然後建立新檔案。distributedfilesystem返回dfsoutputstream,客戶端用於寫資料。客戶端開始寫入資料,dfsoutputstream將資料分成塊,寫入data queue。data queue由data streamer讀取,並通知元資料節點分配資料節點,用來儲存資料塊(每塊預設複製3塊)。分配的資料節點放在乙個pipeline裡。data streamer將資料塊寫入pipeline中的第乙個資料節點。第乙個資料節點將資料塊傳送給第二個資料節點。第二個資料節點將資料傳送給第三個資料節點。dfsoutputstream為發出去的資料塊儲存了ack queue,等待pipeline中的資料節點告知資料已經寫入成功。如果資料節點在寫入的過程中失敗:

關閉pipeline,將ack queue中的資料塊放入data queue的開始。

當前的資料塊在已經寫入的資料節點中被元資料節點賦予新的標示,則錯誤節點重啟後能夠察覺其資料塊是過時的,會被刪除。

失敗的資料節點從pipeline中移除,另外的資料塊則寫入pipeline中的另外兩個資料節點。

元資料節點則被通知此資料塊是複製塊數不足,將來會再建立第三份備份。

當客戶端結束寫入資料,則呼叫stream的close函式。此操作將所有的資料塊寫入pipeline中的資料節點,並等待ack queue返回成功。最後通知元資料節點寫入完畢。

讀取檔案的過程:

客戶端(client)用filesystem的open()函式開啟檔案distributedfilesystem用rpc呼叫元資料節點,得到檔案的資料塊資訊。對於每乙個資料塊,元資料節點返回儲存資料塊的資料節點的位址。distributedfilesystem返回fsdatainputstream給客戶端,用來讀取資料。客戶端呼叫stream的read()函式開始讀取資料。dfsinputstream連線儲存此檔案第乙個資料塊的最近的資料節點。data從資料節點讀到客戶端(client)當此資料塊讀取完畢時,dfsinputstream關閉和此資料節點的連線,然後連線此檔案下乙個資料塊的最近的資料節點。當客戶端讀取完畢資料的時候,呼叫fsdatainputstream的close函式。 在讀取資料的過程中,如果客戶端在與資料節點通訊出現錯誤,則嘗試連線包含此資料塊的下乙個資料節點。失敗的資料節點將被記錄,以後不再連線。

優點:1)能夠處理超大的檔案;

2)流式訪問資料。hdfs能夠很好的處理「一次寫入,多次讀寫」的任務。也就是說,乙個資料集一旦生成了,就會被複製到不同的儲存節點中,然後響應各種各樣的資料分析任務請求。在多數情況下,分析任務都會涉及到資料集中的大部分資料。所以,hdfs請求讀取整個資料集要比讀取一條記錄更加高效。

3)可以執行在比較廉價的商用機器集群上。

缺點和改進策略:

1)不適合低延遲資料訪問:hdfs是為了處理大型資料集分析任務的,主要是為達到大資料分析,所以延遲時間可能會較高。改進策略:對於那些有低延時要求的應用程式,hbase是乙個更好的選擇。通過上層資料管理專案來盡可能地彌補這個不足。在效能上有了很大的提公升,它的口號就是goes real time。使用快取或多master設計可以降低client的資料請求壓力,以減少延時。還有就是對hdfs系統內部的修改,這就得權衡大吞吐量與低延時了。

3)不支援多使用者寫入以及任意修改檔案:在hdfs的乙個檔案中只有乙個寫入者,而且寫操作只能在檔案末尾完成,即只能執行追加操作。目前hdfs還不支援多個使用者對同一檔案的寫操作,以及在檔案任意位置進行修改。

Hadoop中HDFS的儲存機制

hadoop中hdfs的儲存機制 hdfs hadoop distributed file system 是hadoop分布式計算中的資料儲存系統,是基於流資料模式訪問和處理超大檔案的需求而開發的。下面我們首先介紹hdfs中的一些基礎概念,然後介紹hdfs中讀寫操作的過程,最後分析了hdfs的優缺點...

hadoop的HDFS檔案儲存

1 什麼是hdfs?hdfs適合做 儲存大檔案。上g t甚至p。一次寫入,多次讀取。並且每次作業都要讀取大部分的資料。搭建在普通商業機群上就可以了。雖然會經常宕機,但hdfs有良好的容錯機制。hdfs不適合做 實時資料獲取。如果有這個需求可以用hbase。很多小檔案。因為namenode要儲存hdf...

Hadoop中hdfs如何儲存檔案

安裝hadoop單機版 hadoop檔案系統操作指令 從安裝hadoop 單機版的配置說起 在這裡配置了hadoop的檔案目錄 1.啟動hadoop 並上傳檔案 上傳檔案命令 hadoop fs put hadoop 2.9.2.tar.gz hdfs hdgroup01 9000 可以看到已經上傳...