使用Java API之下載HDFS文件至本地(解決)


問題描述:

(1)運行copyToLocalFile文件下載,win10電腦出現空指針報錯,文件可以下載下來,但是內容是空的

解決措施:

方法一:(不建議使用)

(1)這是一種暫時性回避錯誤方法,有些文件(特指使用java新建的文本)下載后打開是亂碼。

將:fileSystem.copyToLocalFile(src,dst);
改為:fileSystem.copyToLocalFile(false,src,dst,true);

方法二:

(2)配置環境變量

文件打開后依舊亂碼(特指使用java新建的文本),而通過命令行上傳的文件不是亂碼(未解決)

下載對應版本的winutils.exe、hadoop.dll

我的hadoop版本是:hadoop-2.6.0-cdh5.15.1

我的winutils.exe、hadoop.dll下載的版本是:2.7.6

將下載好的bin文件夾(包含winutils.exe、hadoop.dll)放入G:\BaiduNetdiskDownload\hadoop2.7.6

設置環境變量:

  用戶變量:

    變量名:HADOOP_HOME

    變量值:G:\BaiduNetdiskDownload\hadoop2.7.6

  系統變量:

    變量名:Path

    變量值:%HADOOP_HOME%\bin;

將hadoop.dll放進C:\Windows\System32中

重新啟動電腦。 

 

 1 package com.imooc.bigdata.hadoop.hdfs;
 2 
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.fs.FSDataOutputStream;
 5 import org.apache.hadoop.fs.FileSystem;
 6 import org.apache.hadoop.fs.Path;
 7 import org.apache.hadoop.io.IOUtils;
 8 import org.apache.hadoop.util.Progress;
 9 import org.apache.hadoop.util.Progressable;
10 import org.junit.After;
11 import org.junit.Before;
12 import org.junit.Test;
13 
14 import java.io.BufferedInputStream;
15 import java.io.File;
16 import java.io.FileInputStream;
17 import java.io.InputStream;
18 import java.net.URI;
19 
20 /**
21  * 使用Java API操作HDFS文件系統
22  *
23  * 因為是放在test下面,所以最好使用單元測試的方式
24  * 在pom中引入的jUnit單元測試的方式
25  * 單元測試有兩個方法:(1)在單元測試之前進行;(2)在單元測試之后進行
26  *
27  * 關鍵點:
28  * 1)創建Configuration
29  * 2)獲取FileSystem
30  * 3)剩下的是HDFS API的操作
31  */
32 
33 public class HDFSApp {
34 
35 
36     public static final String HDFS_PATH = "hdfs://hadoop000:8020";
37     //Configuration、FileSystem是每一個方法使用之前必須構建的
38     Configuration configuration = null;
39     FileSystem fileSystem = null;
40 
41     @Before
42     public void setup() throws Exception{
43         System.out.println("-----setup-----");
44         configuration = new Configuration();
45         configuration.set("dfs.replication", "1");
46         /*
47          *構造一個訪問指定HDFS系統的客戶端對象
48          * 第一個參數:HDFS的URI
49          * 第二個參數:客戶端指定的配置參數
50          * 第三個參數:客戶的用戶名
51          */
52         fileSystem = FileSystem.get(new URI("hdfs://hadoop000:8020"), configuration, "hadoop");
53     }
54 
55     /*
56      * 拷貝HDFS文件系統 至 本地主機文件
57      */
58     @Test
59     public void copyToLocalFile() throws Exception{
60         Path src = new Path("/hdfsApi/test/hello.txt");
61         Path dst = new Path("G:/BaiduNetdiskDownload");
62         fileSystem.copyToLocalFile(false, src, dst, true);
63     }
64 
65 
66     @After
67     public void tearDown(){
68         System.out.println("-----tearDown-----");
69 
70         //置空
71         configuration = null;
72         fileSystem = null;
73     }
74 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM