HDFS是一個主/從(Mater/Slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統一樣,可以通過目錄路徑對文件執行CRUD(Create、Read、Update和Delete)操作。但由於分佈式存儲的性質,HDFS集群擁有一個NameNode和一些DataNode。NameNode管理文件系統的元數據,DataNode存儲實際的數據。客戶端通過同NameNode和DataNodes的交互訪問文件系統。客戶端聯繫NameNode以獲取文件的元數據,而真正的文件I/O操作是直接和DataNode進行交互的。
hdfs就是一個分塊,冗餘。可擴展的大硬盤。
使用hdfs dfs 或者hadoop fs命令對文件進行增刪改查的操作
hadoop fs -ls / 列出HDFS下的文件
hadoop fs -put file / 將文件file上傳至hdfs
hadoop fs -mkdir /dirname 在hdfs中創建目錄
hadoop fs -text /filename 將源文件輸出為文本格式
hadoop fs -rm /filename hdfs刪除文件
更多命令請自行百度、google
通過java程序訪問hdfs,就把HDFS集群當成一個大的系統磁盤就行了!
從HDFS中讀取文件
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
InputStream in = new URL("hdfs://192.168.56.100:9000/test.data").openStream();
IOUtils.copyBytes(in, System.out, 4096, true);
學習使用FileSystem類
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000"); //基本配置
FileSystem fileSystem = FileSystem.get(conf);
boolean b = fileSystem.exists(new Path("/hello")); //判斷是否存在
System.out.println(b);
boolean success = fileSystem.mkdirs(new Path("/msb")); //創建目錄
System.out.println(success);
success = fileSystem.delete(new Path("/msb"), true); //刪除目錄
System.out.println(success);
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true); //創建文件到hdfs
FileInputStream fis = new FileInputStream("c:/test/core-site.xml"); //創建一個輸入流
IOUtils.copyBytes(fis, out, 4096, true);
FileStatus[] statuses = fileSystem.listStatus(new Path("/")); //查看文件或目錄信息
for(FileStatus status : statuses) {
System.out.println(status.getPath());
System.out.println(status.getPermission());
System.out.println(status.getReplication());
}
關於基本環境的搭建可以參考我前兩篇的文章