1. 程式人生 > >HDFS(四)——使用 HDFS 的 JavaAPI

HDFS(四)——使用 HDFS 的 JavaAPI

通過 HDFS 提供的 Java API,我們可以完成以下功能:

  1. 在 HDFS 上建立目錄

  2. 通過 FileSystem API 讀取資料(下載檔案)

  3. 寫入資料(上傳檔案)

  4. 檢視目錄及檔案的資訊

  5. 檢視某個檔案在 HDFS 叢集中的位置

  6. 刪除資料

  7. 獲取 HDFS 叢集上所有資料節點的資訊

一、在 HDFS 上建立目錄

@Test
public void testMkDir() throws Exception {
    Configuration conf = new Configuration
(); conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000"); // 獲取一個HDFS 客戶端 FileSystem client = FileSystem.get(conf); // 建立目錄 boolean flag = client.mkdirs(new Path("/f1")); // 關閉 client.close(); System.out.println(flag); }

二、通過 FileSystem API 讀取資料(下載檔案)

@Test
public void testDownLoad
() throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000"); FileSystem client = FileSystem.get(conf); // 開啟一個輸入流 <------HDFS InputStream in = client.open(new Path("/tools/stt.txt")); // 構造一個輸出流 ----> D:\\temp\\down.txt OutputStream out =
new FileOutputStream("D:\\down.txt"); // 目錄必須事先存在 // 將輸入流中的資料寫到輸出流 IOUtils.copyBytes(in, out, 1024); /*byte[] buffer = new byte[1024]; int len = 0; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } out.flush(); out.close(); in.close();*/ }

三、寫入資料(上傳檔案)

@Test
public void testUpLoad() throws Exception {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

    FileSystem client = FileSystem.get(conf);

    // 構造一個輸入流
    InputStream in = new FileInputStream("D:\\TestUpload.java");
    // 構造一個輸出流,不存在目錄則會建立
    OutputStream out = client.create(new Path("/tool/upload.java"));
    IOUtils.copyBytes(in, out, 1024);
}

四、檢視目錄及檔案的資訊

@Test
public void testCheckFileInformation() throws Exception {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

    FileSystem client = FileSystem.get(conf);
    // 列出根目錄下所有檔案及目錄的資訊
    FileStatus[] fileStatus = client.listStatus(new Path("/tool"));
    for (FileStatus status : fileStatus) {
        String dir = status.isDirectory() ? "目錄" : "檔案";
        // 全路徑名
        String path = status.getPath().toString();
        // 檔名
        String name = status.getPath().getName();
        System.out.println(dir + "-----" + name + ",path:" + path);
        // 訪問時間
        System.out.println("訪問時間:" + status.getAccessTime());
        // 資料塊的大小
        System.out.println("資料塊的大小:" + status.getBlockSize());
        // 所屬組
        System.out.println("所屬組:" + status.getGroup());
        // 長度
        System.out.println("長度:" + status.getLen());
        // 修改時間
        System.out.println("修改時間:" + status.getModificationTime());
        // 擁有者
        System.out.println("擁有者:" + status.getOwner());
        // 許可權
        System.out.println("許可權:" + status.getPermission());
        // 冗餘度
        System.out.println("冗餘度:" + status.getReplication());
    }
}

五、檢視某個檔案對應的資料塊在 HDFS 叢集中的位置

@Test
public void testFindFileBlockLocation() throws Exception {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

    FileSystem client = FileSystem.get(conf);

    // Path必須是一個檔案,不能是目錄
    FileStatus fStatus = client.getFileStatus(new Path("/tool/upload.java"));

    BlockLocation[] blocks = client.getFileBlockLocations(fStatus, 0, fStatus.getLen());
    for (BlockLocation block : blocks) {
        // 檔案所對應的資料塊可能分佈在多臺伺服器上,所以返回的是陣列
        System.out.println(Arrays.toString(block.getHosts()) + "\t" + Arrays.toString(block.getNames()));
    }
}

六、刪除資料

@Test
public void testDeleteFile() throws Exception {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

    FileSystem fs = FileSystem.get(conf);
    // 第二個引數表示是否遞迴
    boolean flag = fs.delete(new Path("/tool"), true);
    System.out.println(flag ? "刪除成功" : "刪除失敗");
}

七、獲取 HDFS 叢集上所有資料節點的資訊

@Test
public void testDataNode() throws Exception {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://192.168.220.111:9000");

    DistributedFileSystem fs = (DistributedFileSystem) FileSystem.get(conf);
    DatanodeInfo[] dataNodeStats = fs.getDataNodeStats();

    for (DatanodeInfo dataNode : dataNodeStats) {
        System.out.println(dataNode.getHostName() + "\t" + dataNode.getName());
    }
}