【问题标题】:java.lang.StackOverflowError when joining RDDs - only on a cluster加入 RDD 时出现 java.lang.StackOverflowError - 仅在集群上
【发布时间】:2016-06-23 04:10:25
【问题描述】:

我遇到了一个只有在集群上运行 spark 作业时才会发生的问题。 当我在本地模式下运行时不会发生这种情况。

非常欢迎有关如何解决此问题的建议,但也非常感谢有关如何处理/调试此问题的建议。

我遇到的问题是,当我尝试加入 rdds 时,我得到一个 java.lang.StackOverflowError,显然是在对象序列化期间。 这是一些堆栈跟踪(它很长但会重复) -

Caused by: java.lang.StackOverflowError
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1427)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)

仅当我尝试加入两个 rdds 时才会出现此问题。

rdd1.join(rdd2).count

如果不是,我会这样做

rdd1.count
rdd2.count

此错误不会重现。
(对我来说,这意味着这个问题与我加入两个 RDD 的事实有关,而不是与 RDD 的构造方式有关,因为它们似乎是单独成功处理的,但我可能是错的。)

RDD 由简单案例类的元组组成

val rdd1: RDD[(Device, Option[Usage])] = ...
val rdd2: RDD[(Device, Seq(Problem)] = ...

案例类只有简单的属性(String、Int、DateTime、Option[?])

case class Device(customerId: String, appId: String, deviceId: String, lastEngagement: Option[DateTime], firstSeen: Option[DateTime], lastEngagementUserClass: Option[String])
case class Usage(customerId: String, appId: String, deviceId: String, eventTimestamp: DateTime, appVersion: String, appVersionCode: Int, appSignature: Int, osVersion: String, lifecyclePhase: String, userClass: String)
case class Problem(customerId: String, appId: String, deviceId: String, eventTimestamp: DateTime, problemType: Int, problemSubType: Int, problemReasonId: String)

我正在使用 Spark 1.6.1 和 scala 2.10.5。

有什么建议吗?

更新:

我意识到这是一个广泛的问题。 不幸的是,它并不容易重现,因为它必须在火花集群上运行(不能在本地模式下重现),而且,它似乎无法用小样本数据重现 - 至少,我无法来创建这样的样本数据。

我希望有类似问题的人能够帮助我。我想我的问题是 - 你有类似的问题吗?你最后是怎么解决的?您是如何解决问题的?

【问题讨论】:

标签: apache-spark


【解决方案1】:

在我找到解决方案后进行跟进 - 在这里写下,以防其他人遇到同样的问题。

我的结论是序列化问题与

rdd1.join(rdd2).

我的结论是,因为我打电话时问题没有重现

rdd1.count()
rdd2.count()

有效地强制每个 rdd 单独计算。

这个假设是错误的——调用 count 根本不需要序列化对象。它只需要计算每个分区,然后对结果求和。

当我打电话时

rdd1.collect()

问题确实重现了,我能够更深入地挖掘,并最终找到我的代码中存在的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2018-10-03
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多