Java 无法读取风暴喷口中的输入文件
我有一个可以从日志文件中读取的风暴喷口。因此,当我在本地测试代码时,它工作得很好,因为我在运行作业时传递运行时参数 但是当我在集群中部署代码时,它会给出一个Java 无法读取风暴喷口中的输入文件,java,apache-storm,Java,Apache Storm,我有一个可以从日志文件中读取的风暴喷口。因此,当我在本地测试代码时,它工作得很好,因为我在运行作业时传递运行时参数 但是当我在集群中部署代码时,它会给出一个FileNotFoundException 所以我的问题是如何在集群系统中将输入传递到喷口 我使用ResourceLocation将一些查找表传递给Bolt,但如果以相同的方式传递给Spout,则会产生相同的错误 我还尝试将参数传递给conf.put(“logfile”,args[0])和喷口应该在其open()方法中读取conf对象。这也是
FileNotFoundException
所以我的问题是如何在集群系统中将输入传递到喷口
我使用ResourceLocation将一些查找表传递给Bolt,但如果以相同的方式传递给Spout,则会产生相同的错误
我还尝试将参数传递给conf.put(“logfile”,args[0])驱动程序类中的code>和喷口应该在其open()
方法中读取conf对象。这也是行不通的
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
collector_out = collector;
try {
this.context = context;
this.filereader = new FileReader(conf.get("logfile").toString());
} catch (FileNotFoundException e) {
throw new RuntimeException("Error reading file ["+conf.get("logfile")+"]");
}
}
public void nextTuple() {
try {
br = new BufferedReader(filereader);
line = br.readLine();
while(line != null){
count++;
collector_out.emit(new Values(line));
Thread.sleep(2);
line = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
finally{
completed = true;
}
}
因此,如果你知道如何让它运行,那将是一个很大的帮助。在集群模式下,当你用open方法读取一个文件时,每个节点都会转到它的本地路径,并且可能不是所有节点都有该文件
解决此问题的好方法是在集群中装载nfs系统,在集群节点之间共享一个目录,并将文件放入该目录中。我有一个像你这样的喷口,用这种方式工作 你能给你的喷口加些代码吗?风暴群无法识别常规路径。最好使用NFS或其他替代方法。您需要将文件保存在所有节点都可以访问的位置。。正如前面的评论中所建议的,您可以使用NFS或等效的。。。要验证是否在一个节点中运行storm并将文件保留在那里,您应该可以获得预期的输出