在分布式模式下使用Storm时,为什么不能将结果写入Bolt中的文件?在LocalCluster中正常工作

时间:2013-07-23 04:41:54

标签: java apache-storm topology

我更改了WordCount中的课程WordCountTopology,如下所示:

public static class WordCount extends BaseBasicBolt {
    Map<String, Integer> counts = new HashMap<String, Integer>();

    @Override
    public void execute(Tuple tuple, BasicOutputCollector collector) {
        String word = tuple.getString(0);
        Integer count = counts.get(word);
        if(count==null) count = 0;
        count++;
        counts.put(word, count);
        OutputStream o;
        try {
            o = new FileOutputStream("~/abc.txt", true);
            o.write(word.getBytes());
            o.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        collector.emit(new Values(word, count));
    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("word", "count"));
    }
}

我将该单词写入文件abc.txt

当我在本地模式下运行WordCountTopology(使用LocalCluster)时,它运行正常。但是当以分布式模式运行时(使用StormSubmitter.submitTopology()方法),WordCount类没有将单词写入abc.txt,就好像execute()方法没有运行所有。谁能给我一些想法?非常感谢!

P.S。我确定我的灵气,主管,ui,zookeeper正常运行,我可以在127.0.0.1:8080看到该任务。

1 个答案:

答案 0 :(得分:1)

主要问题是abc.txt文件的位置。此文件将在您提交拓扑的系统中创建。因此,此文件在其他群集计算机中不可用。您可以检查主管日志中找不到的文件错误。要解决此问题,您需要一些NFS配置,通过该配置,所有群集计算机可以共享公共位置。配置NFS后,在公共位置创建新文件,以便此文件可供所有主管使用。