HDFS讀寫數據過程原理分析

Hadoop HDFS讀寫數據過程原理分析

        在學習hadoop hdfs的過程中,有很多人在編程實踐這塊不知道該其實現的原理是什麼,爲什麼通過幾十行小小的代碼就可以實現對hdfs的數據的讀寫。
        在下面的介紹中會詳細的說明該其過程實現的原理(圖片選自中國大學MOOC[大數據技術原理與應用]課程)。

一、讀數據的原理分析

在這裏插入圖片描述

1. 打開文件。

        用Java導入FileSystem類,通過FileSystem.get(conf)聲明一個實例對象fs,從而分佈式系統底層的配置文件會被項目所調用,如core-site.xml、hdfs-site.xml;進而生成一個子類DistributedFileSystem,這時候實例對象fs與分佈式系統也就緊緊相關了。
        由於我們要讀數據,當然就需要使用到輸入流,這時候輸入流的類型是FsDataInputStream,其中封裝着DFSInputStream。
        在這裏爲什麼我們看不見或者無法調用DFSInputStream呢,因爲這是Hadoop後臺自動給其封裝的好的,真正與Hadoop當中的名稱節點進行交流的,其實是DFSInputStream,而不是FsDataInputStream。
        FsDataInputStream在項目中是幹嘛呢,其實是與客戶端進行交流的。

2. 獲取數據塊信息

        由於FsDataInputStream內部封裝了DFSInputStream,要獲取項目所需要的數據被存放到哪些數據節點,因此DFSInputStream會通過conf中的配置文件信息遠程與名稱節點進行交流。
        通過當中的ClientProtocal.getBlockLocations()方法來向名稱節點查找項目所需的數據被存放到哪些數據節點,而名稱節點會把文件的開始一部分數據位置信息返回去。

3. 讀取請求

        客戶端獲得輸入流FsDataInputStream返回的數據位置信息,就可以使用read函數讀取數據
        這時候肯定不少就近客戶端的存在,事實上,名稱節點在返回時還包括將數據節點距離客戶端的遠近進行排序,而客戶端會自動選擇距離最近的一個數據節點進行連接,接着讀取數據。

4. 讀取數據

        當客戶端讀取完數據後,FsDataInputStream需要關閉和數據節點的連接。

5. 獲取數據塊信息

        對應剛纔的第二步,我們可能只讀取了文件數據的部分數據塊位置信息,因此需要再次通過ClientProtocal.getBlockLocations()方法來向名稱節點查找項目所需的下一個數據被存放到哪些數據節點。
同樣的,名稱節點會返回下一個數據的數據節點位置信息節點列表給客戶端。

6. 讀取數據

        客戶端獲取信息後,繼續通過read函數與這些數據節點進行連接,不斷循環,知道完成所有數據庫的讀取。

7. 關閉文件

        客戶端調用FsDataInputStream輸入流的關閉操作close,關閉整個文件讀取數據的過程。

二、寫數據的原理分析

在這裏插入圖片描述

1. 創建文件請求

        與讀數據一樣,通過FileSystem.get(conf)聲明一個實例對象fs,從而分佈式系統底層的配置文件會被項目所調用,如core-site.xml、hdfs-site.xml;進而生成一個子類DistributedFileSystem,這時候實例對象fs與分佈式系統也就緊緊相關了。
        由於我們要寫數據,當然就需要使用到輸出流,這時候輸出流的類型是FsDataOutputStream,其中封裝着DFSOutputStream。
        在這裏爲什麼我們看不見或者無法調用DFSOutputStream呢,因爲這是Hadoop後臺自動給其封裝的好的,真正與Hadoop當中的名稱節點進行交流的,其實是DFSOutputStream,而不是FsDataOutputStream。
        FsDataOutputStream在項目中是幹嘛呢,其實是與客戶端進行交流的。

2. 創建文件元數據

        DFSOutputStream執行RPC遠程調用,讓名稱節點在文件系統的命名空間中新建一個文件。
        名稱節點不會直接創建文件,首先會進行檢查,檢查該文件是否已存在,接着會檢查客戶端是否有權限去創建該文件。如果檢查通過,名稱節點則會創建該文件,通過數組返回。

3. 寫入數據

        由於寫數據要寫入數據節點,而數據副本也會被相應寫入進去,有點類似於流水線。在HDFS中有一種非常高效的寫數據方式,叫作流水線的複製方式。
        將客戶端要寫的數據,分成一個個小的數據包,這些數據包會被放在DFSOutputStream對象的內部隊列,之後DFSOutputStream向名稱節點申請保存這些數據塊的數據節點。

4 寫入數據包

        名稱節點返回信息後,客戶端可以知道寫入到哪些數據節點,一個數據節點列表有很多個數據節點,這些數據節點會被排成一個隊列, 並且把一個數據保存到多個數據節點上,形成數據流的管道。
        而放在隊列的數據包會被再次打包成數據包,將其發送到整個數據流管道當中的第一個數據節點,接着第一個數據節點發送給第二個數據節點以此類推。因爲這些數據包要重複寫到這些數據塊上,一模一樣的數據塊也叫數據副本。 這些數據節點就形成一個流水線。

5 接收確認包

        當最後一個數據節點寫好數據塊後,就會返回一個確認包。最後一個數據節點發送給最後第二個數據節點以此類推,傳回到第一個數據節點,再傳回到客戶端。

6 關閉文件

        客戶端接收到時則說明數據的整個寫操作完成。完成後就可以關閉文件。

7 寫操作完成

        由此整個HDFS寫操作就就完成。

        具體的代碼就不一一展示了,這裏主要是介紹其原理的過程分析,後續需要代碼的小夥伴可以在評論區回覆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章