代码中目标路径dst格式的区别比较:
Path dst = new Path("qj1");
和
Path dst = new Path("hdfs://master:9000/qj2");
代码如下:
package com.lango.mapreduce.example.chainmapper;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CopyToHDFS {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://master:9000");
FileSystem fs = FileSystem.get(conf);
fs.copyFromLocalFile(new Path("/home/wqj/opt/140702152709log.txt"), new Path("qj1"));
fs.copyFromLocalFile(new Path("/home/wqj/opt/140702152709log.txt"), new Path("hdfs://master:9000/qj2"));
}
}
运行结果:
Path dst = new Path("qj1");
Path dst = new Path("hdfs://master:9000/qj2");
可见,dst输出文件格式写法不一样,其结果存放位置也不一样。
总结:
猜想:
Path dst = new Path("qj1");
HDFS中,用户默认是在“/user/hadoop/”目录下。
可以通过运行“hadoop fs -ls”验证猜想。
运行“hadoop fs -ls”程序结果为:
命令列出的是"/user/hadoop/"目录下的内容。所以,我们现在做的一系列操作都是在"/user/hadoop"目录下。
所以,
Path dst = new Path("qj1");
如果未指定绝对路径,而是如上这种相对路径形式,上传的文件自然就到了"/user/hadoop"目录底下。
如使用
Path dst = new Path("/qj1");
形式,则其结果和
Path dst = new Path("hdfs://master:9000/qj1");
的结果是一致的。都是在HDFS分布式文件系统的根目录下。
感悟:
事实上,HDFS分布式文件系统很多特性和本地文件的很多特性是一样的。