使用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 }

 

posted @ 2021-07-09 16:11  酱汁怪兽  阅读(1685)  评论(0编辑  收藏  举报