01 //APP2中調用的代碼
02 public static final String HDFS_PATH = "hdfs://hadoop:9000/hello";
03 public static final String DIR_PATH = "/d1000";
04 public static final String FILE_PATH = "/d1000/f10000";
05
06 public static void main(String[] args) throws Exception {
07 FileSystem fileSystem = FileSystem.get(new URI(HDFS_PATH),
08 new Configuration());
09 // //建立文件
10 // fileSystem.mkdirs(new Path(DIR_PATH));
11 // //上傳文件
12 // FSDataOutputStream out = fileSystem.create(new Path(FILE_PATH));
13 // FileInputStream in = new FileInputStream("c:/hello.txt");
14 // IOUtils.copyBytes(in, out, 1024,true);
15 // //下載數據
16 // FSDataInputStream in1 = fileSystem.open(new Path(FILE_PATH));
17 // IOUtils.copyBytes(in1, System.out, 1024,true);
18
19 // 刪除文件夾
20 deleteFile(fileSystem);
21 }
22
23 private static void deleteFile(FileSystem fileSystem) throws IOException {
24 fileSystem.delete(new Path(FILE_PATH), true);
25
26 }
注:RPC(remote procedure call)
不一樣java進程間的對象方法的調用。一方稱做服務端(server),一方稱做客戶端(client)。
server端提供對象,供客戶端調用的,被調用的對象的方法的執行發生在server端。
RPC是hadoop框架運行的基礎。
rpc通訊
上圖爲RPC通訊調用的一系列方法最終達到把文件寫入到linux文件系統中的過程,可是因爲hadoop中hdfs分佈式文件系統的API封裝的特別 好,讓調用者感受不到這個複雜的過程,對用戶或者程序而言實際是經過網絡來訪問文件的動做,但對用戶看來就像訪問本地磁盤同樣,充分體現了通透性....
綜上:對於HDFS的操做在應用中只需掌握FileSystem,而不須要關注數據是存放在DataNode的哪一個塊中(由於這個工做時交給NameNode的)....
注意:雖然客戶端上傳數據的時候是經過DataStreamer向NameNode申請block塊和blockid,可是數據的傳輸行爲並非經過NameNode轉的,而是與DataNode直接鏈接!!php
15023619_vEwU.jpg(127.44 KB, 下載次數: 0)java