目錄
- 1.5.5 HDFS讀寫決議
- 1.5.5.1 HDFS讀資料流程
- 1.5.5.2 HDFS寫資料流程
1.5.5 HDFS讀寫決議
1.5.5.1 HDFS讀資料流程

- 客戶端通過Distributed FileSystem向NameNode請求下載檔案,NameNode通過查詢元資料, 找到檔案塊所在的DataNode地址,
- 挑選一臺DataNode(就近原則,然后隨機)服務器,請求讀取資料,
- DataNode開始傳輸資料給客戶端(從磁盤里面讀取資料輸入流,以Packet為單位來做校驗),
- 客戶端以Packet為單位接收,先在本地快取,然后寫入目標檔案,
1.5.5.2 HDFS寫資料流程

-
客戶端通過Distributed FileSystem模塊向NameNode請求上傳檔案,NameNode檢查目標檔案是否已存在,父目錄是否存在,
-
NameNode回傳是否可以上傳,
-
客戶端請求第一個 Block上傳到哪幾個DataNode服務器上,
-
NameNode回傳3個DataNode節點,分別為dn1、dn2、dn3,
-
客戶端通過FSDataOutputStream模塊請求dn1上傳資料,dn1收到請求會繼續呼叫dn2,然后dn2呼叫dn3,將這個通信管道建立完成,
-
dn1、dn2、dn3逐級應答客戶端,
-
客戶端開始往dn1上傳第一個Block(先從磁盤讀取資料放到一個本地記憶體快取),以Packet為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個確認佇列等待確認,
-
當一個Block傳輸完成之后,客戶端再次請求NameNode上傳第二個Block的服務器,(重復執行 3-7步),
驗證Packet代碼
@Test
public void testUploadPacket() throws IOException {
//1 準備讀取本地檔案的輸入流
final FileInputStream in = new FileInputStream(new File("e:/lagou.txt"));
//2 準備好寫出資料到hdfs的輸出流
final FSDataOutputStream out = fs.create(new Path("/lagou.txt"), new Progressable() {
public void progress () { //這個progress方法就是每傳輸64KB(packet)就會執行一次,
System.out.println("&");
}
});
//3 實作流拷貝
IOUtils.copyBytes(in, out, configuration); //默認關閉流選項是true,所以會自動 關閉
//4 關流 可以再次關閉也可以不關了
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/539582.html
標籤:大數據
