1、HDFS相關類說明java
FileSystem:通用文件系統的抽象基類,能夠被分佈式文件系統繼承,全部可能使用Hadoop文件系統的代碼都要使用到這個類。apache
DistributedFileSystem:Hadoop爲FileSystem這個抽象類提供了多種具體的實現,DistributedFileSystem就是FileSystem在HDFS文件系統中的實現。緩存
FSDataInputStream:FileSystem的open()方法返回的是一個輸入流FSDataInputStream對象,在HDSF文件系統中具體的輸入流就是DFSInputStream。服務器
FSDataOutputStream:FileSystem的create()方法返回的是一個輸出流FSDataOutputStream對象,在HDFS文件系統中具體的輸出流就是DFSOutputStream。網絡
2、讀數據的過程分佈式
客戶端連續調用open()、read()、close()讀取數據時,HDFS內部執行流程以下:
函數
ps:在讀取數據的過程當中,若是客戶端與數據節點通訊時出現錯誤,就會嘗試鏈接包含此數據塊的下一個數據節點oop
代碼舉例:學習
import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FSDataInputStream; public class Hdfsread { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); Path file = new Path("test"); FSDataInputStream getIt = fs.open(file); BufferedReader d = new BufferedReader(new InputStreamReader(getIt)); String content = d.readLine(); //讀取文件一行 System.out.println(content); d.close(); //關閉文件 fs.close(); //關閉hdfs } catch (Exception e) { e.printStackTrace(); } } }
3、寫數據過程.net
客戶端向HDFS寫數據是一個複雜的過程,客戶端連續調用create()、write()和close()時,HDFS內部執行過程以下:(ps:不發生任何異常狀況)
代碼舉例:
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; public class Hdfswrite { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); byte[] buff = "Hello world".getBytes(); // 要寫入的內容 String filename = "test"; //要寫入的文件名 FSDataOutputStream os = fs.create(new Path(filename)); os.write(buff,0,buff.length); System.out.println("Create:"+ filename); os.close(); fs.close(); } catch (Exception e) { e.printStackTrace(); } } }
4、簡單總結
讀的過程:
寫的過程:
補充2:若經過檢查,直接先將操做寫入EditLog,WAL(write aheadlog)操做,先寫log在寫內存,寫入失敗經過EditLog記錄校驗。
補充4:packet默認64k。
補充5:寫完一個block塊後彙總確認,不會每一個packet確認。
補充7:HDFS通常狀況下都是強調強一致性,即全部數據節點寫完後才向名稱節點彙報。
Reference:
dblab.xmu.edu.cn
blog.csdn.net/qq_38202756/article/details/82262453
學習交流,有任何問題還請隨時評論指出交流。