【问题标题】:Storm reading files throws "Java.lang.OutOfMemoryError: GC overhead limit exceeded"风暴读取文件抛出“Java.lang.OutOfMemoryError:GC 开销限制超出”
【发布时间】:2016-12-02 09:39:49
【问题描述】:

我一直在研究 Storm 拓扑结构,在该拓扑结构中,我使用 execute(tuple) 方法从文件中读取数据,Java 向我抛出了 Java.lang.OutOfMemoryError: GC overhead limit exceeded。 该程序运行良好,直到它抛出该错误。我猜这是因为对垃圾收集器(GC)的调用过多。曾经使用的相同代码可以完美运行,问题是我的 Storm 实现的极端并发。 我认为我的程序在 GC 上花费了太多时间。我编写它的方式是为同一个文件创建大量阅读器,并在每次执行元组时创建 Bolt。

我想知道是否可以在prepare() 方法中读取文件,然后将其保存在字符串数组中?如果是这样,我问,它会不会只为一个 Bolt 实例创建一个阅读器和字符串数组?

这是我的 Bolt 示例:

public static class FilterSomeBolt extends BaseRichBolt {
  OutputCollector _collector;

  public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
    _collector = collector;
  }

  public void execute(Tuple tuple) {
    String entr = tuple.getString(1);
    boolean flagRet=false;
    try {
      String fileName2 = (String)"file.csv";
      BufferedReader reader2 = new BufferedReader(new FileReader(fileName2));
      // read and ignore the header if one exists
      String line2 =reader2.readLine();
      while(line2!= null) {
        if(line2.toLowerCase().contains("something") && line2.toLowerCase().contains(entr.substring(1, 8).toLowerCase())) {
          flagRet=true;
        }//end if
        line2 =reader2.readLine();
      }//end while
  }
}

我正在尝试了解这些方法,希望能得到帮助。 提前致谢!

【问题讨论】:

    标签: java file garbage-collection apache-storm java-io


    【解决方案1】:

    您的文件读取逻辑造成了问题。如果文件的第一行不为空,那么您的 while 循环将运行无限次。请按照代码 sn-p 更新它:

    while((line2 =reader2.readLine())!= null){
        ....//do anything you want
    }
    

    希望这会有所帮助。

    【讨论】:

    • 对不起,我没有放line2的更新,但它在那里,我会编辑问题,bucle完成得恰到好处,错误不在那里,谢谢!
    • 帮助,因为我错过了发布有关问题的“line2”更新,但这不是解决方案,因此我的代码实际上包含该行的更新。感谢您的帮助,但问题仍然存在,所以我赞成您的回答,但我不能接受它是正确的,因为您在问题发布中提供了帮助,但在编程问题中没有帮助,要接受问题,它必须解决编程问题。感谢您帮助我意识到我忘记了帖子上的第 2 行更新,无论如何 :)
    • @Amnor 您是否在阅读部分的 whileloop 后修改 line2 变量:“//一些其他不重要的代码..”。请检查一下。
    • 我刚看了,问题不在于那个bucle,如果你使用Storm,你会意识到我会注意到它。由于 GarbageCollector 的使用过多,该程序运行良好,直到它抛出该错误。曾经使用过的相同代码可以完美运行,问题是我的 Storm 实现的极端并发性,因此螺栓会沿着虚拟机复制自己。问题是,我不确定每次执行元组事件时如何避免 Storm 拓扑复制阅读器,这就是为什么我问是否可以在 prepare() 方法中这样做:)
    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多