maven hadoop 3.x HADOOP_HOME and hadoop.home.dir are unset Not implemented by the WebHdfsFileSystem FileSystem implementation
具体异常如下:
解决方案:
删除pom文件中的hadoop-core的依赖,原因:hadoop-core是1.x的产物,在2.x之后已经被hadoop-common取代,我配置的时候同时使用了这两个依赖导致jar包冲突.
附上我测试上传用的代码
1 /**
2 * 上传文件到hdfs
3 * @author tele
4 *
5 */
6 public class Demo1 {
7 public static void main(String[] args) throws Exception {
8 Configuration conf = new Configuration();
9 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop002:9000"), conf,"tele");
10 fs.copyFromLocalFile(new Path("f:/test.sql"),new Path("/111.sql"));
11 fs.close();
12 System.out.println("上传完毕");
13 }
14 }
如果下载的过程中出现了 HADOOP_HOME and hadoop.home.dir are unset,那么就说明你没有配置windows本地的hadoop环境变量.你可能会想我是远程调用linux下的hadoop,与我本地的hadoop有什么关系?如果你的操作只对远程的hadoop生效,如上传,创建目录,文件改名(写)等那么你是不需要在windows本地配置hadoop的,可一旦涉及到下载(读),hadoop内部的缓存机制要求本地也必须有hadoop,于是也会出现HADOOP_HOME and hadoop.home.dir are unset,解决办法配置HADOOP_HOME并加入%HADOOP_HOME%\bin到PATH中,之后测试下hadoop version命令,有效的话重启你的eclipse/myeclipse,但这还不够,windows下的hadoop还需要winutils.exe,否则会报Could not locate Hadoop executable: xxxx\winutils.exe
测试下载的代码如下
1 static FileSystem fs;
2 static {
3 Configuration conf = new Configuration();
4 try {
5 fs = FileSystem.get(new URI("hdfs://hadoop002:9000"), conf,"tele");
6 } catch (IOException e) {
7 // TODO Auto-generated catch block
8 e.printStackTrace();
9 } catch (InterruptedException e) {
10 // TODO Auto-generated catch block
11 e.printStackTrace();
12 } catch (URISyntaxException e) {
13 // TODO Auto-generated catch block
14 e.printStackTrace();
15 }
16 }
17
18 //下载文件
19 @Test
20 public void downLoadFile() throws Exception{
21 //如果为null,重启myeclipse/eclipse即可
22 System.out.println(System.getenv("HADOOP_HOME"));
23 fs.copyToLocalFile(new Path("/hello2.sql"),new Path("C:/a.sql"));
24 fs.close();
25 System.out.println("下载完毕");
26 }