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
导致了此问题?
答案 0 :(得分:0)
http.content.limit:-1 表示您将获取一个URL,直到到达其内容的末尾为止。如果网址指向无尽的流,例如在线广播,然后内存消耗将增加,直到JVM崩溃为止。这会给您一个内存不足的异常,并且可能不是这里发生的事情。
编辑:感谢您共享URL。我可以重现问题,您介意在GitHub上发布问题吗?谢谢!
结论:这并不是这样的错误,只是在获取整个文档(209和350Kb)时,从JSoup文档到DocumentFragments的转换涉及大量递归并导致堆栈限制崩溃。 通过将-Xss10M设置为VM参数,我设法解析了您提供的2个URL。