【问题标题】:How to access local files on a namenode in Java?如何在 Java 中访问名称节点上的本地文件?
【发布时间】:2020-01-15 18:54:16
【问题描述】:

我的var/log/hadoop-hdfs/hdfs-audit.log 位于本地名称节点上,并由head /var/log/hadoop-hdfs/hdfs-audit.log 访问。我的数据文件由hdfs dfs -ls / 访问,而审计文件可以被cd 到。现在我可以在 java 中访问我的 hdfs 文件,但每次我尝试 fs.getLocal(conf) 时,confconf.set(FileSystem.FS_DEFAULT_NAME_KEY, namenode) 设置,我会在我的计算机上获取本地文件,而不是 namenode 上的本地文件。

下面的工作是获取data下的所有文件和目录。

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数据库和表等文件一样。有没有办法做到这一点。

【问题讨论】:

    标签: java hadoop hdfs


    【解决方案1】:

    这里的 Namenode 没有什么特别之处。即使可能,这也意味着系统上的任何文件都可以通过网络读取,这是不安全的。

    简而言之,如果不将该脚本本地运行到该机器,您将无法访问本地文件。即使调整配置也会使您只能读取 HDFS 数据,而不是任何特定名称节点或数据节点的本地文件

    如果您确实需要读取远程文件,您可以使用 JSch,然后通过 Java 的 SSH 连接使用 cat 文件内容。或者您可以在名称节点上运行一项服务,通过 Web 服务器公开您的特定日志,而不是公开整个文件系统

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2018-06-29
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多