【问题标题】:Apache Spark Task not SerializableApache Spark 任务不可序列化
【发布时间】:2015-04-07 16:06:13
【问题描述】:

我知道以前有人问过这个问题,但我认为我的失败是由于不同的原因。

            List<Tuple2<String, Integer>> results = results.collect();
            for (int i=0; i<results.size(); i++) {
                System.out.println(results.get(0)._1);
            }


Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task not serializable: java.io.NotSerializableException: tools.MAStreamProcessor$1 at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1214) at 

我在 Spark 中有一个简单的“map/reduce”程序。上面的行获取reduce 步骤的结果并循环遍历每个结果元素。如果我将它们注释掉,那么我不会收到任何错误。我远离使用 'forEach' 或简洁的 for () 认为底层生成的产生不可序列化的元素。我已经把它归结为一个简单的 for 循环,所以想知道为什么我仍然遇到这个错误。

谢谢, 兰吉特

【问题讨论】:

    标签: exception serialization apache-spark


    【解决方案1】:

    使用-Dsun.io.serialization.extendedDebugInfo=true 标志打开序列化调试日志记录。它会告诉你它究竟是什么无法序列化。

    答案与您粘贴的行无关。 collect 不是问题的根源,它只是触发 RDD 计算的原因。如果您不计算 RDD,则不会向执行者发送任何内容。因此,如果没有 collect,在前面的步骤中意外包含不可序列化的内容不会导致任何问题。

    【讨论】:

    • 感谢您的提示。我确实得到了更多的调试信息,但它并没有完全指向不可序列化的对象。我看到了像“-Object blah、-Field blah、-Object blah 等”这样的信息。最终发现罪魁祸首是在 lambda 函数内部实例化的 JSONObject。当我将它移到一个静态函数中并调用该函数来获取我的 JSON 处理时,它解决了序列化错误。非常感谢您的帮助!
    • 全面了解Spark序列化stackoverflow.com/questions/40818001/…
    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2015-06-17
    • 2018-04-06
    • 2021-03-16
    • 1970-01-01
    • 2015-12-16
    • 2017-03-21
    相关资源
    最近更新 更多