配置windows平臺的Hadoop環境
在 windows 上做 HDFS 客戶端應用開發,需要設置 Hadoop 環境,而且要求是windows 平臺編譯的 Hadoop,不然會報以下的錯誤:
Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
參考:https://blog.csdn.net/huyishero/article/details/72896484
創建Maven工程,引入pom依賴
<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> </dependencies>
客戶端對象
在 java 中操作 HDFS,主要涉及以下 Class:
Configuration:該類的對象封轉了客戶端或者服務器的配置;
FileSystem:該類的對象是一個文件系統對象,可以用該對象的一些方法來對文件進行操作,通過 FileSystem 的靜態方法 get 獲得該對象。
FileSystem fs = FileSystem.get(conf)
get 方法從 conf 中的一個參數 fs.defaultFS 的配置值判斷具體是什麼類型的文件系統。如果我們的代碼中沒有指定 fs.defaultFS,並且工程 classpath下也沒有給定相應的配置,conf中的默認值就來自於hadoop的jar包中的core-default.xml , 默認值 爲 : file:/// ,則獲取的將 不 是 一 個DistributedFileSystem 的實例,而是一個本地文件系統的客戶端對象。
示例代碼
1 public class TestHDFS { 2 3 public static void main(String[] args) throws Exception{ 4 Configuration conf = new Configuration(); 5 //指定使用的是hdfs文件系統 6 // conf.set("fs.defaultFS","hdfs://node-1:9000"); 7 8 //FileSystem是hadoop操作文件系統的核心類 9 //通過FileSystem的靜態方法獲取文件系統客戶端對象 10 // FileSystem fs = FileSystem.get(conf); 11 //設置uri,conf,用戶身份 12 FileSystem fs = FileSystem.get(new URI("hdfs://node-1:9000"),conf,"root"); 13 14 //創建一個文件夾 15 // fs.mkdirs(new Path("/createByJava")); 16 //上傳文件 17 // fs.copyFromLocalFile(new Path("D:\\test.txt"),new Path("/createByJava/test.txt")); 18 //下載文件 19 // fs.copyToLocalFile(new Path("/createByJava/test.txt"),new Path("D:\\test\\test.txt")); 20 21 //stream形式讀取本地的一個文件 22 FileInputStream in = new FileInputStream(new File("D:\\test.txt")); 23 //創建一個文件 24 FSDataOutputStream out = fs.create(new Path("/test.txt")); 25 //stream形式將本地文件上傳到hdfs 26 IOUtils.copy(in,out); 27 28 fs.close(); 29 } 30 }