无法在风暴喷口中读取输入文件

时间:2014-09-12 15:50:40

标签: java apache-storm

我有一个将从日志文件中读取的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;
    }
}

因此,如果有任何想法如何实现它将是一个很大的帮助。

1 个答案:

答案 0 :(得分:1)

在群集模式下,当您以open方式读取文件时,每个节点都会转到其本地路径,并且您可能没有在所有节点中拥有该文件。

解决此问题的好方法是在群集中安装nfs系统,在群集节点之间共享目录并将文件放入该目录。我有一个像你这样的鲸鱼喷水。