Hadoop HDFS 建立檔案流程詳解

2022-01-17 09:52:09 字數 3979 閱讀 2477

通過解析客戶端建立檔案流程,認知hadoop的hdfs系統的一些功能和概念。

hdfs系統核心元件,負責分布式檔案系統的名字空間管理、inode表的檔案對映管理。如果不開啟備份/故障恢復/federation模式,一般的hdfs系統就只有1個namenode,當然這樣是存在單點故障隱患的。

nn管理兩個核心的表:檔案到塊序列的對映、塊到機器序列的對映。

第乙個表儲存在磁碟中,第二表在nn每次啟動後重建。

負責nn和其它元件的通訊介面的開放(ipc、http)等。

nn通過客戶端協議(clientprotocol)和客戶端通訊,通過資料節點協議(datanodeprotocol)和dn通訊。

管理檔案系統相關,承擔了nn的主要職責。

分布式檔案系統中存放實際資料的節點,儲存了一系列的檔案塊,乙個dfs部署中通常有許多dn。

dn和nn,dn和dn,dn和客戶端都通過不同的ipc協議進行互動。

通常,dn接受來自nn的指令,比如拷貝、刪除檔案塊。

客戶端在通過nn獲取了檔案塊的位置資訊後,就可以和dn直接互動,比如讀取塊、寫入塊資料等。

dn節點只管理乙個核心表:檔案塊到位元組流的對映。

在dn的生命週期中,不斷地和nn通訊,報告自己所儲存的檔案塊的狀態,nn不直接向dn通訊,而是應答dn的請求,比如在dn的心跳請求後,回覆一些關於複製、刪除、恢復檔案塊的命令(comands)。

dn和外界通訊的介面會報告給nn,想和此dn互動的客戶端或其它dn可以通過和nn通訊來獲取這一資訊。

檔案塊,hadoop檔案系統的原語,hadoop分布式檔案系統中儲存的最小單位。乙個hadoop檔案就是由一系列分散在不同的datanode上的block組成。

檔案塊在分布式網路中的位置,也包括一些塊的元資料,比如塊是否損壞、塊的大小、塊在檔案中的偏移等。

分布式檔案系統的客戶端,使用者可以獲取乙個客戶端例項和namenode及datanode互動,dfsclient通過客戶端協議和hadoop檔案系統互動。

租約,當客戶端建立或開啟乙個檔案並準備進行寫操作,namenode會維護乙個檔案租約,以標記誰正在對此檔案進行寫操作。客戶端需要定時更新租約,否則當租約過期,nn會關閉檔案或者將檔案的租約交給其它客戶端。

續約管控執行緒,當乙個dfsclient呼叫申請租約後,如果此執行緒尚未啟動,則啟動,並定期向namenode續約。

當hadoop的分布式集群啟動之後,可以通過fs或shell來建立檔案,fs建立檔案的命令如下:

//cluser是hadoop集群,通過fs和集群檔案系統互動

final distributedfilesystem fs = cluster.getfilesystem();

// 要建立的檔名

final path tmpfile1 = new path("/tmpfile1.dat");

//建立檔案

public static void createfile(filesystem fs, path filename, long filelen,

short replfactor, long seed) throws ioexception

fsdataoutputstream out = null;

try

}

如果op是write_block,呼叫寫資料塊的方法,此方法會根據資料來源是客戶端還是其他datanode、塊建立的階段等條件進行不同的邏輯。

4.6.2 資料在pipeline中流動

在本例中,第乙個收到資料的dn會再啟動乙個blockreceiver執行緒,以接收實際的塊資料,在本地儲存了塊資料後,其負責向pipeline中的後續dn繼續傳送塊資料。

每次向下游dn節點傳送資料,標誌著資料目的節點的targets陣列都會排除自身,這樣,就控制了pipeline的長度。

下游收到塊資料的dn會向上游dn或者客戶端報告資料接收狀態。

這種鏈式或者序列化的資料轉移方式,就像資料在管道中從上游流向下游,所以這種方式稱作pipeline

4.6.3 pipeline的生命週期
datastreamer執行緒啟動後,pipeline進入pipeline_setup_create階段;

資料流初始化後,pipeline進入data_streaming階段;

資料傳送完畢後,pipeline進入pipeline_close階段。

客戶端在datastreamer執行緒啟動後,同時啟動了乙個responseprocessor執行緒,此執行緒用於接收pipeline中來自下游節點的資料接收狀態報告pipelineack,同時此執行緒和datastreamer執行緒協調管理pipeline狀態。

當datastreamer向pipeline傳送資料時,會將傳送的資料報(packet)從資料佇列(data queue)中移除,並加入資料確認佇列(ack queue):

//datastreamer傳送資料後,將dataqueue的第乙個元素出隊,並加入ackqueue

one = dataqueue.getfirst();

dataqueue.removefirst();

ackqueue.addlast(one);

而當responseprocessor收到下游的pipelineack後,據此確認資訊來判斷pipeline狀態,是否需要重置和重新調整。如果確認資訊是下游節點資料接收成功了,就將確認佇列(ackqueue)的第乙個資料報刪除。

//responseprocessor收到成功的ack,就將ackqueue的第乙個包移除

lastackedseqno = seqno;

ackqueue.removefirst();

dataqueue.notifyall();

通過這樣的方式,datastreamer可以確認資料報是否傳送成功,也可以確認全部的資料報是否已經傳送完畢。

顯然,當ackqueue空了,並且已經傳送的資料報是塊裡的最後乙個包,資料就傳送完畢了。

傳送完畢的判斷如下所示:

if (one.lastpacketinblock)  catch (interruptedexception  e) }}

if (streamerclosed || haserror || !dfsclient.clientrunning)

//在沒有錯誤的情況下,ackqueue為空,並且包one是block的最後乙個包,資料就傳送完了

stage = blockconstructionstage.pipeline_close;

}

4.7 傳送檔案操作完成請求(completefile)

客戶端向namenode傳送completefile請求:

nn收到請求後,驗證塊的blockpoolid是否正確,接著對操作許可權、檔案寫鎖(write lock)、安全模式、租約、inode是否存在、inode型別等等進行驗證,最後記錄操作日誌並返回給客戶端。

4.8 停止檔案租約(endfilelease)

客戶端在完成檔案寫操作後,呼叫leaserenewer(lr)例項,從lr管理的續約檔案表中刪除此檔案,表明不再更新租約,一段時間後,租約在nn端自然失效。

資料流建立檔案

以前一直是把檔案轉為資料流存入資料庫儲存,例項多是應用在儲存上。如今需要把excel檔案以二進位製流存入資料庫中,當使用者需要做excel資料分析時,得先把資料流建立為乙個檔案,然後再對這個檔案進行處理。上傳檔案以二進位制儲存資料庫中,insus.net在這裡就不做演示了,因為在insus.net的...

資料流建立檔案

以前一直是把檔案轉為資料流存入資料庫儲存,例項多是應用在儲存上。如今需要把excel檔案以二進位製流存入資料庫中,當使用者需要做excel資料分析時,得先把資料流建立為乙個檔案,然後再對這個檔案進行處理。上傳檔案以二進位制儲存資料庫中,insus.net在這裡就不做演示了,因為在insus.net的...

建立檔案流 IO流快速入門,通俗易懂

本章file內容知識主要來自b站孫探老師的講解外加一點點個人的理解,傳送門 biu file說完了再回到io流 io流中的壓縮 io流的轉換 圖1 仔細看過上圖中的朋友們一定對io流有了略微的一點認知 io input輸入流和output輸出流 建立功能,刪除功能,重新命名功能,判斷功能,獲取功能 ...