hdfs中的绝对路径,就比较简单,就是类似/a/b/c/xxx这样的,就是从根目录开始,通过这个名字找到文件(目录),这个Linux的绝对路径是一样的概念。
由于我们并不会像操作Linux文件系统一样cd到hdfs的某个目录下,于是,hdfs中一般来说没有“当前目录”的概念(用fuse或者NFS情况除外)。于是一个hadoop fs -ls a/b/c/xxx这样的访问,就是“相对于hdfs上的当前用户目录”而说的相对路径。因此,如果你用一个叫XYZ的用户访问a/b/c/xxx的时候,前面就要拼上用户目录的前缀,就是/user/XYZ/a/b/c/xxx了(前面这个home目录的前缀“/user”其实也可以通过自行定义dfs.user.home.dir.prefix这个配置指定个别的)。
可以参考DistributedFileSystem.java中的实现。这个类的open(Path f, final int bufferSize)方法中,有如下的实现:
public FSDataInputStream open(Path f, final int bufferSize)
throws IOException {
statistics.incrementReadOps(1);
Path absF = fixRelativePart(f);
return new FileSystemLinkResolver<FSDataInputStream>() {
这里面的fixRelativePart方法就是将一个相对路径转换成绝对路径的地方。