package com.cn.hadoop.hdfs; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.junit.Before; import org.junit.Test; public class HdfsApi { // 定義一個fileSystem的變量,用的是Hadoop的包 FileSystem fileSystem = null; // 添加一個註解 @Before public void getfileSystem() throws IOException, InterruptedException, URISyntaxException{ // 獲取一個具體的文件系統對象 fileSystem = FileSystem.get( // 建立一下HDFS文件系統的訪問路徑,就是Hadoop配置文件中的core-sit.xml中的HDFS文件系統的所在機器 new URI("hdfs://linux.centos.one:8020"), // 建立一個Hadoop的配置文件的類 new Configuration(), // 就是Linux啓動的用戶名 "hadoop"); } /** * 從HDFS文件系統下載文件 * 首先編寫一個輸入流,將內容輸入到本地文件緩存。 * 而後編寫一個輸出流,將內容輸出到本地磁盤。 */ /** * @throws IOException * @throws IllegalArgumentException */ @Test public void testDownload() throws IllegalArgumentException, IOException{ // 構建一個輸入流,將須要下載的文件寫入到客戶端的內存中 FSDataInputStream in = fileSystem.open(new Path("/user/beifeng/mapreduce/wordcount/input/wc.input")); // 構建一個輸出流,將須要下載的文件從內存中寫入到本地磁盤 FileOutputStream out = new FileOutputStream("D://11111111111111111111111111111111111111.txt"); /** * 參數說明: * in * 表明輸入流,讀取HDFS文件系統的文件到本機內存中 * out * 表明輸出流,將本機內存中的文件寫入到本地磁盤中 * 4096 * 緩衝區大小 * true * 自動關閉流,若是不使用自動關閉的話須要手動關閉輸入輸出流 * * 手動關閉輸入輸出流: * IOUtils.closeStream(in); * IOUtils.closeStream(out); */ IOUtils.copyBytes(in, out, 4096, true); } /** * 上傳文件到HDFS文件系統 * @throws IOException * @throws IllegalArgumentException */ @Test public void testUpload() throws IllegalArgumentException, IOException{ // 構建一個輸入流,將本機須要上傳的文件寫入到內存中 FileInputStream in = new FileInputStream("D:\\settings.xml"); // 構建一個輸出流,將客戶端內存的數據寫入到HDFS文件系統指定的路徑中 FSDataOutputStream out = fileSystem.create(new Path("/input/sting.xml"), true); /* * 參數說明: * in * 表明輸入流,讀取HDFS文件系統的文件到本機內存中 * out * 表明輸出流,將本機內存中的文件寫入到本地磁盤中 * 4096 * 緩衝區大小 * true * 自動關閉流,若是不使用自動關閉的話須要手動關閉輸入輸出流 * * 手動關閉輸入輸出流: * IOUtils.closeStream(in); * IOUtils.closeStream(out); */ IOUtils.copyBytes(in, out, 4096, true); } /** * 測試建立一個目錄 * bin/hdsf dfs -mkdir [-p] /dir * @throws IOException * @throws IllegalArgumentException */ @Test public void testMakeDir() throws IllegalArgumentException, IOException{ boolean isSuccess = fileSystem.mkdirs(new Path("/testMK")); System.out.println(isSuccess); } /** * 測試刪除目錄/文件: * @throws IOException * @throws IllegalArgumentException * */ @Test public void testDel() throws IllegalArgumentException, IOException{ System.out.println( // 返回的是一個boolean類型的值 fileSystem.delete( // 指定要刪除的目錄 new Path("/testMK"), // 是否使用遞歸刪除 true )); } }