我有一个将从日志文件中读取的Storm Spout。因此,当我在本地测试代码时,它运行良好,因为我在运行Job时传递运行时参数。
但是当我在集群中部署代码时,它会提供FileNotFoundException
。
所以我的问题是如何将输入传递给集群系统中的Spout。
我正在使用资源位置将少量Lookup表传递给Bolts,但如果我以相同的方式传递给Spout,则会产生相同的错误。
我还尝试将参数传递给驱动程序类中的conf.put("logfile", args[0]);
,并且spout应该在其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;
}
}
因此,如果有任何想法如何实现它将是一个很大的帮助。
答案 0 :(得分:1)
在群集模式下,当您以open方式读取文件时,每个节点都会转到其本地路径,并且您可能没有在所有节点中拥有该文件。
解决此问题的好方法是在群集中安装nfs系统,在群集节点之间共享目录并将文件放入该目录。我有一个像你这样的鲸鱼喷水。