hdfs生成目录树

linux中可以安装tree插件生成目录树,方便了解文件的位置。如下图所示

对于如何列出Hdfs的目录树,自带的hadoop并没有提供,解决的方法可以将hdfs文件系统mount到本地文件系统再使用tree命令。这里自己实现了一个生成目录树的小程序,结果如下,另存为查看大图

实现代码:

/**
 * Created by hequn on 2014/12/13.
 */
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class ReadHdfs {
    private static final Configuration config;
    private static FileSystem fs = null;
    private static int depthArray[] = new int[1000];

    static {
        config = new Configuration();
        config.addResource("hadoop/core-site.xml");
        config.addResource("hadoop/hdfs-site.xml");
        config.addResource("hadoop/mapred-site.xml");
        config.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
        config.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
        config.set("mapred.jop.tracker", "hdfs://192.168.178.92:9001");
        config.set("fs.default.name", "hdfs://192.168.178.92:9000");
        try {
            fs = FileSystem.get(config);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获得detectPath目录下的文件列表
     * @param detectPath
     * @return
     */
    public static List<Path> listFiles(String detectPath) {
        List<Path> files = new ArrayList<Path>();
        try {
            FileStatus[] status = fs.listStatus(new Path(detectPath));
            for(int i = 0; i < status.length; ++i) {
                files.add(status[i].getPath());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return files;
    }

    /**
     * 获得的文件带有路径前缀,此方法将前缀去掉,剩下文件名
     * @param input
     * @return
     */
    public static String getFileName(String input) {
        return input.substring(input.lastIndexOf('/') + 1);
    }

    /**
     * 格式控制
     * @param depth
     */
    public static void printPrex(int depth) {
        //System.out.print("    ");
        for(int i = 0; i < depth; ++i) {
            if(depthArray[i] > 0 ) System.out.print("│   ");
            else System.out.print("    ");
        }
    }

    /**
     * 递归打印目录树
     * @param inputPath
     * @param depth
     */
    public static void hdfsTree(String inputPath, int depth) {
        if(depth == -1) {
            System.out.println(".");
            hdfsTree(inputPath, 0);
            return;
        }
        List<Path> files = ReadHdfs.listFiles(inputPath);
        for(int i = 0, sz = files.size(); i < sz; ++i) {
            depthArray[depth] = sz - i - 1;
            ReadHdfs.printPrex(depth);

            if(depthArray[depth] == 0) System.out.print("└── ");
            else System.out.print("├── ");
            System.out.println(ReadHdfs.getFileName(files.get(i).toString()));

            try {
                if(fs.isDirectory(files.get(i))) {
                     ReadHdfs.hdfsTree(files.get(i).toString(), depth + 1);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ReadHdfs.hdfsTree(args[0], -1);
    }
}

 

posted on 2014-12-13 16:04  hequn8128  阅读(1294)  评论(0编辑  收藏  举报

导航