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