pio训练阶段的java.lang.StackOverflowError

时间:2016-06-29 16:45:06

标签: java debugging apache-spark docker predictionio

pio train(成功pio build之后)给出了一个错误:

[ERROR] [Executor] Exception in task 0.0 in stage 39.0 (TID 34)
[WARN] [TaskSetManager] Lost task 0.0 in stage 39.0 (TID 34, localhost): java.lang.StackOverflowError
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2321)
at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2614)
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2624)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1321)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at scala.collection.immutable.$colon$colon.readObject(List.scala:362)
at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)

从这里开始,ObjectInputStreams等会或多或少地重复,直到堆栈已满。

有没有人提示这可能是什么或如何调试?

NB :我在docker容器中运行的是prediction.io,这可能会导致问题,但是又一次:我真的不知道该怎么做了。

真正感谢任何帮助。

PS:我使用SPARK_DAEMON_JAVA_OPTS="-Xss=9m"增加了stacksize但没有效果,但我想无论如何无限递归都是罪魁祸首。

1 个答案:

答案 0 :(得分:2)

在我的案例中也出现了类似的错误(也使用了Docker容器)。我找到了两种解决问题的方法。

选项1:增加预测IO的驱动程序内存

使用--driver-memory标志:

pio train -- --driver-memory 2g

来自Tapster example

  

[使用] --driver-memory选项来限制Apache PredictionIO使用的内存(孵化)。没有这个Apache PredictionIO(孵化)可能会消耗太多内存导致崩溃。

选项2:增加JVM内存

这可以通过在export JAVA_OPTS=-Xmx2g之前调用pio train来完成。

有关JVM内存选项的更多详细信息,请参阅What are the Xms and Xmx parameters when starting JVMs?