在CGFT大數(shù)據技術中,讀數(shù)據的過程是很重要的。具體有什么,隨融躍小編往下看!
客戶端連續(xù)調用open()、read()、close()讀取數(shù)據時,HDFS內部的執(zhí)行過程:
1. 客戶端通過filesystem.open()打開文件,相應的,在HDFS文件系統(tǒng)中,disterbutedfilesysrem具體體現(xiàn)了filesystem,因此,調用open()后,disterbutedfilesysrem會創(chuàng)建輸入流filesystem,而對于HDFS而言,具體的輸入流就是dfsinputstream。
2. 在dfsinputstream的構造函數(shù)中,輸入流通過clientProtocal.getblocklocations()遠程調用名稱節(jié)點,獲得文件開始部分數(shù)據塊的保存位置。對于該數(shù)據塊,名稱節(jié)點返回保存該數(shù)據塊的所有數(shù)據節(jié)點的地址,同時,根據距離客戶端的遠近對數(shù)據節(jié)點進行排序。然后,disterbutedfilesysrem會利用dfsinputstream來實例化fsdatainputstream,返回給客戶端,同時返回了數(shù)據塊的數(shù)據節(jié)點地址。
3. 獲得輸入流fsdatainputstream后,客戶端調用read()函數(shù)開始讀取數(shù)據。輸入流根據前面的排序結果,選擇距離客戶端zui近的數(shù)據節(jié)點建立連接并讀取數(shù)據。
4. 數(shù)據從該數(shù)據節(jié)點讀到客戶端,當該數(shù)據塊讀取完畢時,fsdatainputstream關閉和該數(shù)據節(jié)點的連接。
5. 輸入流通過getblocklocations()方法查找下一個數(shù)據塊。
6. 找到該數(shù)據塊的zui佳數(shù)據節(jié)點,讀取數(shù)據。
7. 當客戶端讀取完畢數(shù)據的時候,調用fsdatainputstream的close()函數(shù),關閉輸入流。
需要注意的是,在讀取數(shù)據的過程中,如果客戶端與數(shù)據節(jié)點通信時出現(xiàn)錯誤,就會嘗試連接包含此數(shù)據塊的下一個數(shù)據節(jié)點。