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