1

Storm Crawler 在 Kubernetes 集群中运行,我们在 JSoupParserBolt 中遇到许多 StackOverFlow 错误

java.lang.StackOverflowError at org.apache.xerces.dom.ParentNode.internalInsertBefore(Unknown Source) at org.apache.xerces.dom.ParentNode.insertBefore(Unknown Source) 
at org.apache.xerces.dom.NodeImpl.appendChild(Unknown Source) at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:111) 
at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136) at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136) 
at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136) at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136) 
at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136) at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136) 
at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136) at com.digitalpebble.stormcrawler.parse.JSoupDOMBuilder.createDOM(JSoupDOMBuilder.java:136)

爬虫拓扑配置为

  worker.heap.memory.mb: 8062
  topology.worker.max.heap.size.mb: 8062
  http.content.limit: -1

可能http.content.limit: -1导致这个问题?

4

1 回答 1

0

http.content.limit:-1表示您将获取一个 URL,直到您到达其内容的末尾。如果一个 URL 指向一个无穷无尽的流,例如在线广播,那么内存消耗将会增加,直到 JVM 崩溃。这会给你一个内存不足的异常,这可能不是这里发生的事情。

编辑:感谢分享网址。我可以重现这个问题,你介意在 GitHub 上打开一个问题吗?谢谢!

结论:这本身不是一个错误,只是在获取整个文档(209 和 350Kb)时,从 JSoup 文档到 DocumentFragments 的转换涉及大量递归并导致堆栈限制崩溃。通过将 -Xss10M 设置为 VM 参数,我设法解析了您提供的 2 个 url。

于 2018-11-01T09:50:56.067 回答