構建HDFS訪問客戶端對象

HDFS在生產生活中應用主要是客戶端的開發,其核心步驟是從HDFS提供的API構建一個HDFS的訪問客戶端對象,通過該對象對HDFS上的文件進行增刪改查

1.配置JAVA環境

首先電腦裏cmd輸入java -version  查看版本,如果沒有出現下面圖片這樣的現象,那麼說明你沒有JAVA環境,可以去網上找資料配置JAVA環境(環境好久之前配置的了,沒記錄,就自己找一下吧)

2.下載安裝包

   下載eclipse 並安裝            eclipse安裝包      password:mua5   (workplace自己記住就行)

   下載maven包                     maven   password:5ylo

3.配置eclipse 

Window  ----->    Preferences    ------>  Java     ------>   Installed JREs   ---->   Add(將我們能的JDK找到放進去) 

 

同時把Java   --->   Comlier中的JDK    的版本改成自己的 (我的是1.8的)

 

 

 

 

修改maven,這個裏面ADD的就是上面下載的那個,選在apache-maven-3.3.9就行

 

修改Maven中的 User Settings 修改Settings 路徑是apache-maven-3.3.9/conf/settings.xml   (記得修改settings.xml中的一個路徑,因爲你存的地方肯定和我不一樣!)

 

 

 

 

 4.新建工程

1.建立一個Maven Project   下面就是創建簡單工程,取名啥的

 

2.引入依賴  在pom.xml下我們加入依賴關係 

 

 輸入:

<dependencies>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-common</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-hdfs</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>RELEASE</version>
      </dependency>
  </dependencies>

 3.保存之後更新配置 

之後會產生一個包

 

 在src/main/java下建立包,包下建立一個類

 

 引入參數(出現紅線,就按下ctrl+shift+o鍵進行填包,記得選在帶hadoop的)
輸入  :public class HDFS_CRUD {
    
    FileSystem fs = null;
    
    @Before // 此註解可以保證init方法在程序中最先執行
    public void init() throws Exception{
        // 構造一個配置參數對象,設置一個參數:要訪問的hdfs的uri
        Configuration conf = new Configuration();
        // 這裏指定使用的是hdfs
        conf.set("fs.defaultFS", "hdfs://hadoop01:9000");// 此處使用主機名需要配置windows的host文件
        // 通過如下的方式進行客戶端身份的設置
        System.setProperty("HADOOP_USER_NAME", "root");
        // 通過FileSystem的靜態方法獲取文件系統客戶端對象
        fs = FileSystem.get(conf);
    }

 

 從客戶端中上傳文件(這裏注意斜槓方向)

輸入;

@Test
    public void testAddFileToHdfs() throws IOException {
        
        // 要上傳的文件所在的路徑
        Path src = new Path("D:\\test.txt");
        // 要上傳到hdfs的目標路徑
        Path dst = new Path("/testFile"); // 一定注意此處的testFile就是上傳到hdfs的文件的名字而不是文件夾
        // 上傳
        fs.copyFromLocalFile(src, dst);
        //關閉資源
        fs.close();
    }

 

 

 

從服務器下載文件(是不是感覺指令有那麼一絲屬性)

輸入:// 從hdfs 中複製文件到本地文件系統
    @Test
    public void testDownloadFileToLocal() throws IOException {
        // 下載文件
        Path src = new Path("/long");
        Path dst = new Path("D:/");
        fs.copyToLocalFile(false,src, dst,true);
        
        // 關閉資源
        fs.close();
    }

 

 

 

 查看;刪除;重命名文件

輸入:
    @Test
    public void testMkdirAndDeleteAndRename() throws Exception {
        // 創建目錄
        fs.mkdirs(new Path("/a/b/c"));
        fs.mkdirs(new Path("/long/shi/san"));
        
        // 重命名文件或文件夾
        // fs.rename(new Path("/a"), new Path("/hahahahahaha"));
        
        // 刪除文件夾,如果是非空文件夾,參數2必須給值爲true
        // fs.delete(new Path("/hahahahahaha"),true);
    }

 

 

 查看文件目錄

輸入:

@Test
    public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {
        // 獲取迭代器對象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
        
        while(listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            // 打印當前文件名稱
            System.out.println(fileStatus.getPath().getName());
            // 打印當前文件塊大小
            System.out.println(fileStatus.getBlockSize());
            // 打印當前文件權限
            System.out.println(fileStatus.getPermission());
            // 打印當前文件內容長度
            System.out.println(fileStatus.getLen());
            // 獲取該文件塊信息(包括長度,數據塊,datanode的信息)
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            
            for (BlockLocation blockLocation : blockLocations) {
                System.out.println("block-length:"+blockLocation.getLength()+" -- "+"block-offset:"+blockLocation.getOffset());
                String[] hosts = blockLocation.getHosts();
                
                for (String host : hosts) {
                    System.out.println(host);
                }
            }
            System.out.println("--------------分割線---------");
        }
    }

 

執行一下看看

首先看一下我們hadoop目錄下都有什麼

 實驗現象

 我們在d盤建立一個longshisan.txt傳上去

右擊函數,選擇Run As  進行測試

 

 第一個傳輸成功

 

 第二個下載成功

 

 第三個創建目錄

 

第四個重命名

 

 第五個刪除

 

 最後一個

 

   

 

今日HDFS訪問結束!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章