Hadoop之HDFS檔案讀寫過程,
一、HDFS讀過程
1.1 HDFS API 讀檔案
1 Configuration conf = new Configuration(); 2 FileSystem fs = FileSystem.get(conf); 3 Path file = new Path("demo.txt"); 4 FSDataInputStream inStream = fs.open(file); 5 String data = inStream.readUTF(); 6 System.out.println(data); 7 inStream.close(); View Code
1.2 HDFS讀取檔案過程
1.初始化FileSystem,然後用戶端(client)用FileSystem的open()函數開啟檔案
2.FileSystem用RPC調用中繼資料節點,得到檔案的資料區塊資訊,對於每一個資料區塊,中繼資料節點返回儲存資料區塊的資料節點的地址。
3.FileSystem返回FSDataInputStream給用戶端,用來讀取資料,用戶端調用stream的read()函數開始讀取資料。
4.DFSInputStream串連儲存此檔案第一個資料區塊的最近的資料節點,data從資料節點讀到用戶端(client)
5.當此資料區塊讀取完畢時,DFSInputStream關閉和此資料節點的串連,然後串連此檔案下一個資料區塊的最近的資料節點。
6.當用戶端讀取完畢資料的時候,調用FSDataInputStream的close函數。
7.在讀取資料的過程中,如果用戶端在與資料節點通訊出現錯誤,則嘗試串連包含此資料區塊的下一個資料節點。
8. 失敗的資料節點將被記錄,以後不再串連。【注意:這裡的序號不是一一對應的關係】
1.3HDFS讀取檔案過程圖
二、HDFS寫過程 2.1 HDFS API 寫檔案 1 Configuration conf = new Configuration(); 2 FileSystem fs = FileSystem.get(conf); 3 Path file = new Path("demo.txt"); 4 FSDataOutputStream outStream = fs.create(file); 5 outStream.writeUTF("Welcome to HDFS Java API!!!"); 6 outStream.close(); View Code 2.2 HDFS寫檔案過程
1.初始化FileSystem,用戶端調用create()來建立檔案 2.FileSystem用RPC調用中繼資料節點,在檔案系統的命名空間中建立一個新的檔案,中繼資料節點首先確定檔案原來不存在,並且用戶端有建立檔案的許可權,然後建立新檔案。 3.FileSystem返回DFSOutputStream,用戶端用於寫資料,用戶端開始寫入資料。 4.DFSOutputStream將資料分成塊,寫入data queue。data queue由Data Streamer讀取,並通知中繼資料節點分配資料節點,用來儲存資料區塊(每塊預設複製3塊)。分配的資料節點放在一個pipeline裡。Data Streamer將資料區塊寫入pipeline中的第一個資料節點。第一個資料節點將資料區塊發送給第二個資料節點。第二個資料節點將資料發送給第三個資料節點。 5.DFSOutputStream為發出去的資料區塊儲存了ack queue,等待pipeline中的資料節點告知資料已經寫入成功。 6.當用戶端結束寫入資料,則調用stream的close函數。此操作將所有的資料區塊寫入pipeline中的資料節點,並等待ack queue返回成功。最後通知中繼資料節點寫入完畢。 7.如果資料節點在寫入的過程中失敗,關閉pipeline,將ack queue中的資料區塊放入data queue的開始,當前的資料區塊在已經寫入的資料節點中被中繼資料節點賦予新的標示,則錯誤節點重啟後能夠察覺其資料區塊是過時的,會被刪除。失敗的資料節點從pipeline中移除,另外的資料區塊則寫入pipeline中的另外兩個資料節點。中繼資料節點則被通知此資料區塊是複製塊數不足,將來會再建立第三份備份。 2.3HDFS寫檔案過程圖