通過解析客戶端建立檔案流程,認知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輸出流 建立功能,刪除功能,重新命名功能,判斷功能,獲取功能 ...