HDFS(四)——使用 HDFS 的 JavaAPI
阿新 • • 發佈:2018-11-25
通過 HDFS 提供的 Java API,我們可以完成以下功能:
-
在 HDFS 上建立目錄
-
通過 FileSystem API 讀取資料(下載檔案)
-
寫入資料(上傳檔案)
-
檢視目錄及檔案的資訊
-
檢視某個檔案在 HDFS 叢集中的位置
-
刪除資料
-
獲取 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());
}
}