Apache Spark任务无法序列化。

4

我知道这个问题之前已经被问过了,但我认为我的失败原因不同。

            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'程序。上述代码行获取缩减步骤的结果并循环遍历每个结果元素。如果我注释掉它们,就不会出现错误。我避免使用'forEach'或简洁的for(),因为底层生成的元素可能无法序列化。我已将其简化为一个简单的for循环,所以想知道为什么仍然会遇到此错误。
谢谢, Ranjit
1个回答

8
使用-Dsun.io.serialization.extendedDebugInfo=true标志来打开序列化调试日志记录。它会告诉您无法序列化的具体内容。
答案与您粘贴的代码行无关。collect不是问题的源头,它只是触发RDD计算的东西。如果您不计算RDD,就不会将任何东西发送到执行器。因此,在早期阶段意外包含不可序列化的内容并不会在没有collect的情况下引起问题。

谢谢你的提示。我确实获得了更多的调试信息,但它并没有准确地指出哪个对象不可序列化。我看到的信息列表如下:'-Object blah,-Field blah,-Object blah等等。最终,罪魁祸首是在lambda函数内部实例化的JSONObject。当我将它移动到静态函数中,并调用该函数来获取我的JSON处理时,解决了序列化错误。非常感谢你的帮助! - Ranjit Iyer
为了全面了解Spark序列化,请参考以下链接:https://dev59.com/xVkR5IYBdhLWcg3w0AKy#40818002?sfb=2#40818002 - KrazyGautam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接