以编程方式读取Hadoop Mapreduce程序的输出

nab*_*tar 8 hadoop mapreduce hdfs

这可能是一个基本问题,但我无法在Google上找到答案.
我有一个map-reduce作业,它在输出目录中创建多个输出文件.我的Java应用程序在远程hadoop集群上执行此作业,在作业完成后,它需要使用org.apache.hadoop.fs.FileSystemAPI 以编程方式读取输出.可能吗?
应用程序知道输出目录,但不知道map-reduce作业生成的输出文件的名称.似乎没有办法以编程方式列出hadoop文件系统API中目录的内容.如何读取输出文件?
这似乎是一种常见的情况,我相信它有一个解决方案.但我遗漏了一些非常明显的东西.

Tho*_*lut 19

您正在寻找的方法称为listStatus(Path).它只是将Path中的所有文件作为FileStatus数组返回.然后你可以简单地循环它们创建一个路径对象并阅读它.

    FileStatus[] fss = fs.listStatus(new Path("/"));
    for (FileStatus status : fss) {
        Path path = status.getPath();
        SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);
        IntWritable key = new IntWritable();
        IntWritable value = new IntWritable();
        while (reader.next(key, value)) {
            System.out.println(key.get() + " | " + value.get());
        }
        reader.close();
    }
Run Code Online (Sandbox Code Playgroud)

对于Hadoop 2.x,您可以像这样设置阅读器:

 SequenceFile.Reader reader = 
           new SequenceFile.Reader(conf, SequenceFile.Reader.file(path))
Run Code Online (Sandbox Code Playgroud)