如何在java中访问namenode上的本地文件?

erhoui1w  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(322)

我的 var/log/hadoop-hdfs/hdfs-audit.log 位于本地namenode上,由 head /var/log/hadoop-hdfs/hdfs-audit.log . 我的数据文件由 hdfs dfs -ls / 而审计文件可以用光盘刻录。现在我可以用java访问我的hdfs文件,但每次我尝试 fs.getLocal(conf) 哪里 conf 由设置 conf.set(FileSystem.FS_DEFAULT_NAME_KEY, namenode) ,我在计算机上获取本地文件,而不是namenode上的本地文件。
下面的代码用于获取数据下的所有文件和目录。

public class HdfsAuditLogParser {
    private final String cluster;
    private final FileSystem fs;

    public HdfsAuditLogParser(String cluster, String namenode) throws IOException {
        this.cluster = cluster;
        Configuration conf = new Configuration();
        conf.set(FileSystem.FS_DEFAULT_NAME_KEY, namenode);
        this.fs = FileSystem.get(conf);
    }

    public String parse() throws IOException {
        for (FileStatus f : fs.listStatus(new Path("/data/"))){
            System.out.println(f.getPath().toString());
        }
        return "output";
    }
}

但是如果我把/data/改成/var/log/,它就不起作用了,我甚至尝试过切换 this.fs = FileSystem.getLocal(conf); 但这不起作用,它只给我计算机中var/log/下的文件,而不是namenode中的文件。
简而言之,我想通过java访问hdfs-audit.log文件,就像访问hdfs中的hdfs数据库和表以及其他文件一样。有什么办法吗。

shyt4zoc

shyt4zoc1#

这里的namenode没什么特别的。即使可能,这意味着系统上的任何文件都可以通过网络读取,这是不安全的。
简而言之,如果不在本地计算机上运行脚本,就无法访问本地文件。即使调整配置,也只能读取hdfs数据,而不能读取任何特定namenode或datanode的本地文件
如果您真的需要读取远程文件,那么可以使用jsch cat 通过来自java的ssh连接的文件内容。或者可以在namenode上运行一个服务,通过web服务器公开特定的日志,而不是公开整个文件系统

相关问题