摘要:本文主要研究了HDFS檔案系統的讀寫流程以及基於MRS在windows客戶端下讀寫HDFS檔案的實現。
HDFS(Hadoop分散式檔案系統)是Apache Hadoop專案的一個子專案。
HDFS支援海量資料的儲存,允許使用者把成百上千的計算機組成儲存叢集,其中的每一臺計算機稱為一個節點。使用者通過HDFS的終端命令可以操作其中的檔案和目錄,如同操作本地檔案系統(如Linux)中的檔案一樣。使用者也可以通過HDFS API或MapReduce來程式設計訪問其中的檔案資料。
本文主要研究了HDFS檔案系統的讀寫流程以及基於MRS在windows客戶端下讀寫HDFS檔案的實現。
1. HDFS的架構和後設資料
1.1 HDFS採用master/slaves主從結構模型管理資料,結構模型圖如下
1.2 後設資料的相關概念
Fsimage:檔案系統對映檔案,也是後設資料的映象檔案(磁碟中),儲存某段時間namenode記憶體後設資料資訊
Edits log:操作日誌檔案
1.3 後設資料的工作特點
- (1) namenode始終在記憶體中儲存後設資料,使得“讀操作”更加快
- (2)寫請求時,向edits檔案寫入日誌,成功返回後才修改記憶體,並向客戶端返回
- (3) NameNode記憶體中儲存的是=fsimage+edits
2. 檔案的讀寫流程
2.1 檔案的讀取流程
1) 客戶端Client呼叫FileSystem的open(),返回FSDataInputStream物件給客戶端.DistributeFileSystem物件通過RPC和NameNode通訊,查詢後設資料資訊,確定檔案路徑是否存在以及檢查許可權,返回這個檔案的資料塊位置列表(資料塊位置是有先後順序)
2) 客戶通過FSDataInputStream read()方法讀取資料.FSDataInputStream物件按照資料塊位置優先順序建立一條連線,讀取資料.當此資料塊讀取完畢後,FSDataInputStream物件關閉和此資料節點的連線,然後繼續按照優先順序建立下一個資料塊連線,讀取資料…….在據讀取過程中,如果客戶端在與資料節點通訊時出現錯誤,則會嘗試讀取包含有此資料塊的下一個資料節點,並且失敗的資料節點會被記錄,以後不會再連線
3) 當資料讀取完畢後,呼叫FSDataInputStream物件的close()函式。
2.2 檔案的寫入流程
1)客戶端Client呼叫FileSystem的create()函式,返回FSDataOutputStream物件給客戶端DistributedFileSystem物件通過RPC與namenode通訊,確定檔案存在不存在以及是否有建立檔案的許可權,先將操作寫入log,再載入記憶體,將DataNode列表返回
2) 客戶端通過FSDataOutputStream物件,寫資料.FSDataOutputStream物件將資料按照128M分成塊,寫入Data Queue.然後將DataNode列表和Data Queue通過DataNode列表一同傳送給最近的DataNode.這樣之後client端和NameNode分配的多個DataNode構成pipeline管道.client每次向第一個DataNode寫入一個packet,這個packet便會直接在pipeline裡傳給第二個、第三個DataNode.每個DataNode寫完一個塊後,會返回確認資訊. FSDataoutputStream將確認資訊儲存在ACK Queue.所有的資料塊寫入pipeline中的資料節點,並且ACK Queue成功返回.
3) FSDataOutputStream物件close()方法關閉流.通知後設資料節點寫入完畢
3. 基於華為雲MRS windows下讀寫HDFS的實現
3.1 建立2.1.0非安全叢集
3.2 安全組規則入方向放開windows 客戶端ip和所有埠
3.3 為叢集的各個節點繫結彈性ip
3.4 將彈性ip和叢集節點主機名寫入windows的hosts檔案
3.5 開啟https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-2.1,將樣例程式碼下載下來,然後是idea開啟hdfs-examples專案
3.6 在huawei下面建立test資料夾,並且Test.java檔案放到這個資料夾內
3.7 從叢集下載配置檔案,置於專案conf資料夾下
3.8 將下面配置配置於hdfs-site.xml中
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
3.9 idea執行程式,執行結果如下
附件下載:
Test.rar 1.06KB
文件.docx 455.30KB
本文分享自華為雲社群《HDFS讀寫原理和程式碼簡單實現》,原文作者:劍指南天 。