Java API操作HDFS
?一、問題介紹
?1、基于HDFS?的Java?API實現如下功能:(1)本地文件上傳到HDFS;(2)從HDFS中下載文件到本地系統;(3)HDFS中目錄的創建、刪除、重命名;(4)查看目錄中所有文件的詳細信息。
二、步驟
準備:
在win系統下不配置hadoop環境,直接運行代碼會報錯,顯示缺少winutils.exe 和 hadoop.dll 兩個文件
1-將hadoop-win-2.7.7文件夾拷貝到一個沒有中文的路徑中;
2-在windows系統,配置hadoop的環境變量: HADOOP_HOME,并將%HADOOP_HOME%\bin添加到path中
3-:把hadoop-win-2.7.7文件夾中bin目錄下的hadoop.dll 放到系統盤: C:Windows \System32目錄下
4-關閉windows重啟
下載地址
提取碼:8o47?
1. 搭建項目環境
? 創建一個項目名為“HadoopDemo”,包名為“com.itcast”的Maven項目,并在項目的pom.xml文件中引入hadoop-common、hadoop-hdfs、hadoop-client以及單元測試junit的依賴。
依賴pom.xml
<dependencies> <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.7</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.7</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.7</version></dependency> </dependencies>2. 初始化客戶端對象
? 首先在項目src文件夾下創建com.itcast.hdfsdemo包,并在該包下創建HDFS_CRUD.java文件,編寫Java測試類,構建Configuration和FileSystem對象,初始化一個客戶端實例進行相應的操作
3. 上傳文件到HDFS
? 由于采用Java測試類來實現JavaApi對HDFS的操作,因此可以在HDFS_CRUD.java文件中添加一個testAddFileToHdfs()方法來演示本地文件上傳到HDFS的示例。
4. 從HDFS下載文件到本地
? 在HDFS_CRUD.java文件中添加一個testDownloadFileToLocal()方法,來實現從HDFS中下載文件到本地系統的功能。
5. 目錄操作
? 在HDFS_CRUD.java文件添加一個testMkdirAndDeleteAndRename()方法,實現目錄的創建、刪除、重命名的功能。
6. 查看目錄中的文件信息
在HDFS_CRUD.java文件中添加一個testListFiles()方法,實現查看目錄中所有文件的詳細信息的功能。
完整代碼
package com.itheima.hdfsdemo;import java.io.FileNotFoundException; import java.io.IOException;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.junit.Before; import org.junit.Test;public class HDFS_CRUD {FileSystem fs = null;@Before // 此注解可以保證init方法在程序中最先執行public void init() throws IOException{// 構造一個配置參數對象,設置一個參數:要訪問的hdfs的uriConfiguration conf = new Configuration();// 這里指定使用的是hdfsconf.set("fs.defaultFS", "hdfs://hadoop01:9000");// 此處使用主機名需要配置windows的host文件// 通過如下的方式進行客戶端身份的設置System.setProperty("HADOOP_USER_NAME", "root");// 通過FileSystem的靜態方法獲取文件系統客戶端對象fs = FileSystem.get(conf);}// 上傳文件到hdfs@Testpublic void testAddFileToHdfs() throws IOException {// 要上傳的文件所在的路徑Path src = new Path("F:\\test.txt");// 要上傳到hdfs的目標路徑Path dst = new Path("/testFile"); // 一定注意此處的testFile就是上傳到hdfs的文件的名字而不是文件夾// 上傳fs.copyFromLocalFile(src, dst);//關閉資源fs.close();}// 從hdfs 中復制文件到本地文件系統@Testpublic void testDownloadFileToLocal() throws IOException {// 下載文件Path src = new Path("/testFile");Path dst = new Path("F:/");fs.copyToLocalFile(false,src, dst,true);// 關閉資源fs.close();}// 創建,刪除,重命名文件@Testpublic void testMkdirAndDeleteAndRename() throws Exception {// 創建目錄fs.mkdirs(new Path("/a/b/c"));fs.mkdirs(new Path("/a2/b2/c2"));// 重命名文件或文件夾fs.rename(new Path("/a"), new Path("/a3"));// 刪除文件夾,如果是非空文件夾,參數2必須給值為true// fs.delete(new Path("/a2"),true);}@Testpublic 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 bl : blockLocations) {System.out.println("block-length:"+bl.getLength()+" -- "+"block-offset:"+bl.getOffset());String[] hosts = bl.getHosts();for (String host : hosts) {System.out.println(host);}}System.out.println("--------------分割線---------");}} }三、結果?
?
總結
以上是生活随笔為你收集整理的Java API操作HDFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA书籍
- 下一篇: 优秀工程师应该具备哪些素质_工程师应具备