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) 编辑 收藏 举报