本文讲述在IntelliJ IDEA中使用FileSystem.copyFromLocalFile操作Hadoop时因URI格式有误导致Permission denied的解决过程。
环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1
Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机。
操作代码如下
1 public class CopyFromLocalTestDriver { 2 public static void main(String[] args) { 3 Configuration configuration = new Configuration(); 4 try { 5 FileSystem fileSystem = FileSystem.get(new URI("hadoopalice"), configuration); 6 7 Path dst = new Path("/d1/"); 8 Path src = new Path("/Users/michael/Desktop/Hadoop/Books/EasyHadoop实战手册.doc"); 9 10 fileSystem.copyFromLocalFile(src, dst); 11 12 boolean exists = fileSystem.exists(new Path("/d1/EasyHadoop实战手册.doc")); 13 System.out.println("FILE EasyHadoop实战手册.doc EXISTS STATUS: " + exists); 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } catch (URISyntaxException e) { 17 e.printStackTrace(); 18 } 19 } 20 }
Hadoop中也有相应目录
执行却提示
嗯,你欺负我是小白,一定是。上一张图说了我是有访问权限的。
好,那就是说问题应该不在hadoop上,那就再检查下代码吧。
代码第5行,构造URI时,似乎并不符合URI规则。据Elliotte Rusty Harold. Java Network Programming 3rd Edition第七章的”URI的各部分“一节
URI引用包括多达三个部分:模式、模式特有部分和片段标识符。一般格式为:
scheme:scheme-specific-part:fragment
对比第5行FileSystem fileSystem = FileSystem.get(new URI("hadoopalice"), configuration);少了模式部分,则它是个相对URI。方便起见,加上模式,简单粗暴地解决这个问题,继续后面的学习。
FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoopalice:9000"), configuration);
重新执行,结果如下
查询hadoop,发现文件确实提交了。
时间: 2024-10-27 05:34:01