摘要:本文主要研究了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讀寫原理和代碼簡單實現》,原文作者:劍指南天 。