我的 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数据库和表以及其他文件一样。有什么办法吗。
1条答案
按热度按时间shyt4zoc1#
这里的namenode没什么特别的。即使可能,这意味着系统上的任何文件都可以通过网络读取,这是不安全的。
简而言之,如果不在本地计算机上运行脚本,就无法访问本地文件。即使调整配置,也只能读取hdfs数据,而不能读取任何特定namenode或datanode的本地文件
如果您真的需要读取远程文件,那么可以使用jsch
cat
通过来自java的ssh连接的文件内容。或者可以在namenode上运行一个服务,通过web服务器公开特定的日志,而不是公开整个文件系统