【问题标题】:Task not serializable exception任务不可序列化异常
【发布时间】:2015-06-18 02:41:13
【问题描述】:

由于某种原因,我收到了一个带有以下代码的 Task not serializable 异常。我正在使用 sbt 测试在 spark local 上运行它。

@RunWith(classOf[JUnitRunner])
class NQTest extends FeatureSpec with Matchers with Serializable {
  val conf = new SparkConf().setAppName("NQ Market Makers Test").setMaster("local")
  val sc = new SparkContext(conf)
  ...

  val testData : RDD[(String, String)] = sc.textFile("testcases/NQIntervalsTestData").map { line => (line.split(":", 2)(0), line.split(":", 2)(1)) }
  testData.persist();
  def testDatasets(input : Int) = {
    testData.filter(_ match {
      case (s, _) => (s == "Test Case " + input)
      case _      => false
    }).map(x => x match {
      case (_, line) => line
    })
  }

  ...

  feature("NQIntervals") {
    scenario("Test data sanity check") {
      (testDatasets(1).collect()) should not be null
    }
  }
}

还有例外:

org.apache.spark.SparkException: Task not serializable
        at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:166)
        at org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:158)
        at org.apache.spark.SparkContext.clean(SparkContext.scala:1623)
        at org.apache.spark.rdd.RDD.filter(RDD.scala:303)
        at test.scala.org.<redacted>.NQTest$.testDatasets(NQTest.scala:31)

与我在这里看到的有关此异常的其他堆栈溢出问题不同,这似乎与 RDD 本身有关,而不是我传递给过滤器的函数。

例如,我们可以完全删除过滤器和映射,但在收集过程中仍然会出现异常。从我的谷歌搜索中,我只能找到涉及过滤器或映射内的不可序列化对象的问题的答案,而不是 RDD 本身的问题。

到目前为止我尝试过的事情:

  • 删除了 testDatasets 方法中的过滤器和映射,只返回了 testData 集。这导致调用 collect 时发生异常。
  • 完全移除单元测试框架,让NQTest直接扩展Serializable并写了一个由testDatasets(1).collect()组成的一行main方法:还是一样的异常
  • 已删除 testData.persist():仍然是相同的异常

欢迎任何见解!

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    原来我是个大白痴,在运行实际测试之前就停止了 spark 上下文。 无视

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-02
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2018-04-06
      相关资源
      最近更新 更多